Draft: fix import scale for Legacy DXF importer

Fixes #10253.
This commit is contained in:
Roy-043
2023-11-08 15:23:32 +01:00
committed by Yorik van Havre
parent 12a34be4a6
commit 86788e3777

View File

@@ -706,7 +706,7 @@ def vec(pt):
Base::Vector3 or float
Each of the components of the vector, or the single numerical value,
is rounded to the precision defined by `prec`,
and scaled by the amount of the global variable `dxfScaling`.
and scaled by the amount of the global variable `resolvedScale`.
To do
-----
@@ -714,14 +714,14 @@ def vec(pt):
"""
if isinstance(pt, (int, float)):
v = round(pt, prec())
if dxfScaling != 1:
v = v * dxfScaling
if resolvedScale != 1:
v = v * resolvedScale
else:
v = Vector(round(pt[0], prec()),
round(pt[1], prec()),
round(pt[2], prec()))
if dxfScaling != 1:
v.multiply(dxfScaling)
if resolvedScale != 1:
v.multiply(resolvedScale)
return v
@@ -2076,6 +2076,90 @@ def addToBlock(obj, layer):
layerBlocks[layer] = [obj]
def getScaleFromDXF(header):
"""Get the scale from the header of a drawing object.
Parameters
----------
header : header object
"""
data = header.data
if [9, "$INSUNITS"] in data:
insunits = data[data.index([9, "$INSUNITS"]) + 1][1]
elif [9, "$MEASUREMENT"] in data:
measurement = data[data.index([9, "$MEASUREMENT"]) + 1][1]
insunits = 1 if measurement == 0 else 4
else:
insunits = 0
match insunits:
case 0:
# Unspecified
return 1.0
case 1:
# Inches
return 25.4
case 2:
# Feet
return 25.4 * 12
case 3:
# Miles
return 1609344.0
case 4:
# Millimeters
return 1.0
case 5:
# Centimeters
return 10.0
case 6:
# Meters
return 1000.0
case 7:
# Kilometers
return 1000000.0
case 8:
# Microinches
return 25.4 / 1000.0
case 9:
# Mils
return 25.4 / 1000.0
case 10:
# Yards
return 3 * 12 * 25.4
case 11:
# Angstroms
return 0.0000001
case 12:
# Nanometers
return 0.000001
case 13:
# Microns
return 0.001
case 14:
# Decimeters
return 100.0
case 15:
# Decameters
return 10000.0
case 16:
# Hectometers
return 100000.0
case 17:
# Gigameters
return 1000000000000.0
case 18:
# AstronomicalUnits
return 149597870690000.0
case 19:
# LightYears
return 9454254955500000000.0
case 20:
# Parsecs
return 30856774879000000000.0
case _:
# Unsupported
return 1.0
def processdxf(document, filename, getShapes=False, reComputeFlag=True):
"""Process the DXF file, creating Part objects in the document.
@@ -2137,6 +2221,8 @@ def processdxf(document, filename, getShapes=False, reComputeFlag=True):
readPreferences()
FCC.PrintMessage("opening " + filename + "...\n")
drawing = dxfReader.readDXF(filename)
global resolvedScale
resolvedScale = getScaleFromDXF(drawing.header) * dxfScaling
global layers
layers = []
global doc