Files
2026-07-17 17:45:56 +08:00

83 lines
3.1 KiB
PowerShell

param(
[Parameter(Mandatory = $true)]
[string]$CandidateViewsJson,
[Parameter(Mandatory = $true)]
[string]$OutputRoot,
[string]$ExtractorProject = "tools\drawing-diagnostics\AutoCadDwgExtractor\AutoCadDwgExtractor.csproj",
[string]$ProgId = "AutoCAD.Application.23.1",
[int]$MaxEntities = 200000,
[switch]$Visible
)
$ErrorActionPreference = "Stop"
$repoRoot = Resolve-Path (Join-Path $PSScriptRoot "..\..\..")
$candidateViewsPath = Resolve-Path $CandidateViewsJson
$outputRootPath = New-Item -ItemType Directory -Force -Path $OutputRoot
$extractorPath = Join-Path $repoRoot $ExtractorProject
Write-Host "Building AutoCAD extractor..."
dotnet build $extractorPath | Out-Host
if ($LASTEXITCODE -ne 0) {
throw "AutoCAD extractor build failed."
}
$extractorProjectDir = Split-Path -Parent $extractorPath
$extractorBuildDir = Join-Path -Path $extractorProjectDir -ChildPath "bin\Debug"
$extractorDll = Get-ChildItem -Path $extractorBuildDir -Recurse -Filter "AutoCadDwgExtractor.dll" |
Sort-Object LastWriteTime -Descending |
Select-Object -First 1
if (-not $extractorDll) {
throw "AutoCadDwgExtractor.dll not found."
}
Write-Host "Using extractor: $($extractorDll.FullName)"
$candidates = Get-Content -LiteralPath $candidateViewsPath -Raw | ConvertFrom-Json
$exported = @($candidates | Where-Object { $_.dwg_path -and (Test-Path -LiteralPath $_.dwg_path) })
$total = $exported.Count
$current = 0
foreach ($candidate in $exported) {
$current++
$name = if ($candidate.name) { $candidate.name } else { "candidate_$($candidate.index)" }
$safeName = ($name -replace '[\\/:*?"<>|]', '_')
$candidateOutput = Join-Path $outputRootPath.FullName ("{0:D2}_{1}" -f [int]$candidate.index, $safeName)
New-Item -ItemType Directory -Force -Path $candidateOutput | Out-Null
$signaturePath = Join-Path $candidateOutput "main-view-signature.json"
$logPath = Join-Path $candidateOutput "extractor.log"
if (Test-Path -LiteralPath $signaturePath) {
Write-Host "[$current/$total] signature exists, skip: $signaturePath"
continue
}
Write-Host "[$current/$total] extracting candidate DWG: $($candidate.dwg_path)"
& dotnet $extractorDll.FullName `
--drawing-path $candidate.dwg_path `
--output-dir $candidateOutput `
--prog-id $ProgId `
--visible $Visible.IsPresent `
--close-after-extract true `
--max-entities $MaxEntities `
--main-view-seed-mode solidworks-candidate *> $logPath
if ($LASTEXITCODE -ne 0) {
throw "Candidate $($candidate.index) extraction failed. See log: $logPath"
}
if (-not (Test-Path -LiteralPath $signaturePath)) {
throw "Candidate $($candidate.index) did not produce signature: $signaturePath"
}
Write-Host "[$current/$total] extraction completed: $candidateOutput"
}
@{
ok = $true
candidate_views_json = $candidateViewsPath.Path
output_root = $outputRootPath.FullName
extracted_count = $exported.Count
} | ConvertTo-Json -Depth 4 | Set-Content -LiteralPath (Join-Path $outputRootPath.FullName "batch-summary.json") -Encoding UTF8