【问题标题】:pythonOCC set default units to inchespythonOCC 将默认单位设置为英寸
【发布时间】:2018-05-24 23:09:30
【问题描述】:

请查看短版编辑

一直在寻找这方面的 pythonOCC 文档。

我有以英寸为单位的 .step 文件。以下是 .step 文件中用于确认的行:

#50 =  ( CONVERSION_BASED_UNIT( 'INCH', #122 )LENGTH_UNIT(  )NAMED_UNIT( #125 ) );
#51 =  ( NAMED_UNIT( #127 )PLANE_ANGLE_UNIT(  )SI_UNIT( $, .RADIAN. ) );
#52 =  ( NAMED_UNIT( #127 )SI_UNIT( $, .STERADIAN. )SOLID_ANGLE_UNIT(  ) );
~~~
#122 = LENGTH_MEASURE_WITH_UNIT( LENGTH_MEASURE( 25.4000000000000 ), #267 );

文件读取并在窗口中显示:

当我使用手动坐标制作边界框时,我发现我的框偏离了方向:

位置已关闭,因为 STEP 模型不在 0,0,0 处。

原来 pythonOCC 会自动将所有内容转换为 MM。当我在英寸中手动输入框尺寸时,它将它们读取为 MM。我也尝试过手动转换所有内容(英寸 * 25.4)来处理,但这有问题且丑陋。

我知道 pythonOCC 使用 STEP 文件第 122 行作为转换率,因为我已将其从上面更改为:

#122 = LENGTH_MEASURE_WITH_UNIT( LENGTH_MEASURE( 1.0 ), #267 );

当我这样做时,我的边界框和步进模型完美对齐...但我仍然知道 PythonOCC 认为它正在转换为 MM。

任何人都有更改 pythonocc 的默认单位的经验吗? 我试图在以下 occ 包中找到: OCC.STEPControl、OCC.Display、OCC.AIS 和许多其他人。

编辑:

当我像这样使用自己的坐标绘制我的盒子时:

minPoint = gp_Pnt(minCoords)
maxPoint = gp_Pnt(maxCoords)
my_box = AIS_Shape(BRepPrimAPI_MakeBox(minPoint, maxPoint).Shape())
display.Context.Display(my_box.GetHandle())

我的坐标以英寸为单位,但 pythonOCC 将它们读取为 MM。如果我能以英寸为单位读取自己的坐标,这将得到解决。在 OCC.Display 中找不到关于我的坐标是如何解释的任何内容。类似“OCC.Display.inputUnitsAre("INCHES")”的东西?

编辑 2:

仔细看这里:

https://dev.opencascade.org/doc/refman/html/class_units_a_p_i.html

在 UnitsAPI_SystemUnits 和 SetCurrentUnit 下...虽然我不确定如何在 python 中实现尚未测试。正在努力。

【问题讨论】:

    标签: python python-3.x step


    【解决方案1】:

    您将找到units here 的文档

    看看OCC.Extended.DataExchange模块,你会看到如下函数:

    def write_step_file(a_shape, filename, application_protocol="AP203"):
        """ exports a shape to a STEP file
        a_shape: the topods_shape to export (a compound, a solid etc.)
        filename: the filename
        application protocol: "AP203" or "AP214"
        """
        # a few checks
        assert not a_shape.IsNull()
        assert application_protocol in ["AP203", "AP214IS"]
        if os.path.isfile(filename):
            print("Warning: %s file already exists and will be replaced" % filename)
        # creates and initialise the step exporter
        step_writer = STEPControl_Writer()
        Interface_Static_SetCVal("write.step.schema", "AP203")
    
        # transfer shapes and write file
        step_writer.Transfer(a_shape, STEPControl_AsIs)
        status = step_writer.Write(filename)
    
        assert status == IFSelect_RetDone
        assert os.path.isfile(filename)
    

    默认情况下,OCC 以毫米为单位写入单位,所以我很好奇使用什么函数/方法导出您的 STEP 文件。

    Interface_Static_SetCVal("Interface_Static_SetCVal("write.step.unit","MM")
    

    文档虽然声明此方法 Defines a unit in which the STEP file should be written. If set to unit other than MM, the model is converted to these units during the translation.,但必须显式设置此单位是意料之外的。

    【讨论】:

    • 很遗憾,步骤文件是由cad cam软件生成的。我对此没有控制权。我正在使用 python OCC 手动解析步骤文件。不完全优雅,但我可以一行一行地看到我需要什么。我主要使用 OCC 为我提供视觉效果并进行叠加。有没有更好的方法来使用occ“提取”特征坐标?我会用你的洞察力来看看我是否能在正确的方向上更深入地挖掘。谢谢!
    • 我想我明白了。您的回答帮助我找到了更改此设置的正确位置。一旦我知道我已经改变了单位,我会报告。但是现在,在阅读步骤文件之前,这对我有用:Interface_Static_SetIVal("read.step.product.mode",0)
    • 没关系,那没有。也许我需要在将产品模式更改为 0 后设置单位。使用 xstep.cascade.unit?尝试查看在 pythonOCC 中如何以及在何处设置它。
    • 我可以确认以上都不能解决问题。我需要将自己的坐标(不是来自文件)解释为英寸。见编辑。不过感谢您的回答....我需要更好地了解我的 OWN 问题是什么,这样我才能提出更直接的问题。
    猜你喜欢
    • 2012-12-30
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 2011-09-17
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多