x
This commit is contained in:
@@ -1348,6 +1348,51 @@ optgroup {
|
||||
background: linear-gradient(180deg, var(--bg-primary) 0%, var(--primary-50) 100%);
|
||||
}
|
||||
|
||||
.mechanism-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--space-4);
|
||||
}
|
||||
|
||||
.mechanism-card {
|
||||
border: 1px solid var(--border-light);
|
||||
border-radius: var(--radius-lg);
|
||||
padding: var(--space-4);
|
||||
background: var(--bg-primary);
|
||||
}
|
||||
|
||||
.mechanism-title {
|
||||
font-size: var(--text-base);
|
||||
font-weight: var(--font-semibold);
|
||||
color: var(--text-primary);
|
||||
margin-bottom: var(--space-3);
|
||||
}
|
||||
|
||||
.mechanism-subtitle {
|
||||
font-size: var(--text-sm);
|
||||
font-weight: var(--font-semibold);
|
||||
color: var(--text-secondary);
|
||||
margin-bottom: var(--space-2);
|
||||
}
|
||||
|
||||
.mechanism-notes {
|
||||
margin-top: var(--space-4);
|
||||
padding-top: var(--space-4);
|
||||
border-top: 1px solid var(--border-light);
|
||||
}
|
||||
|
||||
.mechanism-note-list {
|
||||
margin: 0;
|
||||
padding-left: 1.1rem;
|
||||
color: var(--text-secondary);
|
||||
font-size: var(--text-sm);
|
||||
line-height: 1.7;
|
||||
}
|
||||
|
||||
.mechanism-note-list li + li {
|
||||
margin-top: var(--space-2);
|
||||
}
|
||||
|
||||
.result-priority-grid {
|
||||
margin-bottom: var(--space-6);
|
||||
}
|
||||
|
||||
@@ -1509,6 +1509,16 @@ const ResultView = {
|
||||
const selectedHtmlFile = computed(() => selectedScheme.value?.html_file || state.task?.html_file || '');
|
||||
const selectedDfmViolations = computed(() => selectedScheme.value?.dfm_violations || []);
|
||||
const selectedInjectionSystem = computed(() => selectedCavityData.value?.injection_system || state.task?.plan_result?.injection_system || null);
|
||||
const selectedSideActions = computed(() => {
|
||||
return selectedScheme.value?.side_actions
|
||||
|| selectedCavityData.value?.side_actions
|
||||
|| state.task?.side_actions
|
||||
|| null;
|
||||
});
|
||||
const sideActionSummary = computed(() => selectedSideActions.value?.summary || {});
|
||||
const sliderMechanisms = computed(() => selectedSideActions.value?.slider_mechanisms || []);
|
||||
const lifterMechanisms = computed(() => selectedSideActions.value?.lifter_mechanisms || []);
|
||||
const sideActionRecommendations = computed(() => selectedSideActions.value?.recommendations || []);
|
||||
const stageTimingEntries = computed(() => {
|
||||
const timings = state.task?.stage_timings || {};
|
||||
return Object.entries(timings)
|
||||
@@ -1538,6 +1548,7 @@ const ResultView = {
|
||||
const resultAnchorLinks = [
|
||||
{ id: 'candidate-schemes', label: '方案' },
|
||||
{ id: 'engineering-summary', label: '工程摘要' },
|
||||
{ id: 'side-actions', label: '抽芯建议' },
|
||||
{ id: 'dfm-check', label: 'DFM' },
|
||||
{ id: 'preview-3d', label: '预览' },
|
||||
{ id: 'export-cam', label: '导出/CAM' },
|
||||
@@ -1601,6 +1612,15 @@ const ResultView = {
|
||||
return stageNameMap[name] || name;
|
||||
};
|
||||
const formatTiming = (value) => `${Number(value || 0).toFixed(3)} s`;
|
||||
const formatVector = (vector) => {
|
||||
if (!Array.isArray(vector)) return 'N/A';
|
||||
return `[${vector.map(v => Number(v).toFixed(2)).join(', ')}]`;
|
||||
};
|
||||
const formatMechanismSize = (size) => {
|
||||
if (!size || typeof size !== 'object') return 'N/A';
|
||||
const keys = Object.keys(size);
|
||||
return keys.map(key => `${key}:${Number(size[key]).toFixed(1)} mm`).join(' / ');
|
||||
};
|
||||
|
||||
const exportCAD = async (format) => {
|
||||
try {
|
||||
@@ -1695,12 +1715,19 @@ const ResultView = {
|
||||
selectedHtmlFile,
|
||||
selectedDfmViolations,
|
||||
selectedInjectionSystem,
|
||||
selectedSideActions,
|
||||
sideActionSummary,
|
||||
sliderMechanisms,
|
||||
lifterMechanisms,
|
||||
sideActionRecommendations,
|
||||
stageTimingEntries,
|
||||
getWallThicknessSummary,
|
||||
countFeaturesByTypes,
|
||||
getUndercutCount,
|
||||
formatStageName,
|
||||
formatTiming,
|
||||
formatVector,
|
||||
formatMechanismSize,
|
||||
primaryRecommendation,
|
||||
sortedRecommendations,
|
||||
selectedDfmCount,
|
||||
@@ -2062,6 +2089,140 @@ const ResultView = {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="side-actions" v-if="selectedSideActions && (sliderMechanisms.length || lifterMechanisms.length || sideActionRecommendations.length)" class="viewer-section">
|
||||
<h3>倒扣与抽芯建议</h3>
|
||||
<div class="result-grid">
|
||||
<div class="result-card">
|
||||
<h4>总体摘要</h4>
|
||||
<div class="info-list">
|
||||
<div class="info-item">
|
||||
<span class="info-label">倒扣面总数</span>
|
||||
<span class="info-value">{{ sideActionSummary.total_undercut_faces || getUndercutCount() }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">滑块数量</span>
|
||||
<span class="info-value">{{ sideActionSummary.total_slider_count || sliderMechanisms.length }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">斜顶数量</span>
|
||||
<span class="info-value">{{ sideActionSummary.total_lifter_count || lifterMechanisms.length }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">机构复杂度</span>
|
||||
<span class="info-value">{{ sideActionSummary.complexity || 'N/A' }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">液压抽芯</span>
|
||||
<span class="info-value">{{ sideActionSummary.has_hydraulic ? '需要' : '暂不需要' }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">建议动作</span>
|
||||
<span class="info-value">{{ sideActionRecommendations[0] || '当前方案未返回额外抽芯建议' }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="result-card" v-if="sliderMechanisms.length">
|
||||
<h4>滑块抽芯</h4>
|
||||
<div class="mechanism-list">
|
||||
<div class="mechanism-card" v-for="(item, idx) in sliderMechanisms" :key="'slider-' + idx">
|
||||
<div class="mechanism-title">滑块 {{ idx + 1 }}</div>
|
||||
<div class="info-list">
|
||||
<div class="info-item">
|
||||
<span class="info-label">抽芯方向</span>
|
||||
<span class="info-value">{{ formatVector(item.slide_direction) }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">抽芯行程</span>
|
||||
<span class="info-value">{{ item.slide_stroke || 'N/A' }} mm</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">抽芯角度</span>
|
||||
<span class="info-value">{{ item.slide_angle || 'N/A' }}°</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">驱动方式</span>
|
||||
<span class="info-value">{{ item.actuation || 'N/A' }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">导滑方式</span>
|
||||
<span class="info-value">{{ item.guide_type || 'N/A' }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">锁紧方式</span>
|
||||
<span class="info-value">{{ item.locking_mechanism || 'N/A' }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">机构尺寸</span>
|
||||
<span class="info-value">{{ formatMechanismSize(item.block_size) }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">机构位置</span>
|
||||
<span class="info-value">{{ formatVector(item.location) }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mechanism-notes" v-if="item.manufacturing_notes?.length">
|
||||
<div class="mechanism-subtitle">注意事项</div>
|
||||
<ul class="mechanism-note-list">
|
||||
<li v-for="(note, noteIdx) in item.manufacturing_notes" :key="'slider-note-' + idx + '-' + noteIdx">{{ note }}</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="result-card" v-if="lifterMechanisms.length">
|
||||
<h4>斜顶抽芯</h4>
|
||||
<div class="mechanism-list">
|
||||
<div class="mechanism-card" v-for="(item, idx) in lifterMechanisms" :key="'lifter-' + idx">
|
||||
<div class="mechanism-title">斜顶 {{ idx + 1 }}</div>
|
||||
<div class="info-list">
|
||||
<div class="info-item">
|
||||
<span class="info-label">斜顶角度</span>
|
||||
<span class="info-value">{{ item.lifter_angle || 'N/A' }}°</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">斜顶行程</span>
|
||||
<span class="info-value">{{ item.lifter_stroke || 'N/A' }} mm</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">回位方式</span>
|
||||
<span class="info-value">{{ item.return_mechanism || 'N/A' }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">导向方式</span>
|
||||
<span class="info-value">{{ item.guide_type || 'N/A' }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">机构尺寸</span>
|
||||
<span class="info-value">{{ formatMechanismSize(item.block_size) }}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<span class="info-label">机构位置</span>
|
||||
<span class="info-value">{{ formatVector(item.location) }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mechanism-notes" v-if="item.manufacturing_notes?.length">
|
||||
<div class="mechanism-subtitle">注意事项</div>
|
||||
<ul class="mechanism-note-list">
|
||||
<li v-for="(note, noteIdx) in item.manufacturing_notes" :key="'lifter-note-' + idx + '-' + noteIdx">{{ note }}</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="result-card full-width" v-if="sideActionRecommendations.length">
|
||||
<h4>总体建议</h4>
|
||||
<div class="recommendations-list">
|
||||
<div class="recommendation-item medium" v-for="(rec, idx) in sideActionRecommendations" :key="'side-rec-' + idx">
|
||||
<div class="recommendation-text">{{ rec }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="dfm-check" class="viewer-section">
|
||||
<h3>DFM 检查</h3>
|
||||
<div v-if="!selectedDfmViolations.length" class="inline-alert inline-alert-warning">
|
||||
|
||||
Reference in New Issue
Block a user