1

在导入 STEP 格式的 CAD 文件时,我试图在 OpenCASCADE 中获取长度单位转换因子。在我的测试文件中,实体#184将长度设置为,并且在导入期间默认情况下将转换为OpenCASCADE内部使用的毫米

...
#184=(
LENGTH_UNIT()
NAMED_UNIT(*)
SI_UNIT($,.METRE.)
);
...

我相信下面的函数应该如何完成,但无论我尝试什么,“Length_Unit”STEP实体都不匹配,因此我无法获得缩放因子。

void step_unit_scaling(std::string const &file_name) {

  STEPControl_Reader reader;
  reader.ReadFile( file_name.c_str() );

  const Handle(Interface_InterfaceModel) Model = reader.Model();
  Handle(StepData_StepModel) aSM = Handle(StepData_StepModel)::DownCast(Model);

  Standard_Integer NbEntities = Model->NbEntities();
  for (int i=1; i<=NbEntities; i++) {
    Handle(Standard_Transient) enti = aSM->Entity(i);
  
    if (enti->IsKind (STANDARD_TYPE(StepBasic_LengthMeasureWithUnit))) {
      Handle(StepBasic_LengthMeasureWithUnit) MWU = Handle(StepBasic_LengthMeasureWithUnit)::DownCast(enti);
      Standard_Real scal_mm = MWU->ValueComponent();
      std::cout << " --- !!! MATCH !!! --- scal_mm = " << scal_mm << std::endl;
    }
  }
}

有谁知道这是否是正确的方法,或者是否有更好的方法。

4

1 回答 1

0

如果您搜索给定类型的实体,您应该检查类型以查找错误。以下行将显示实际的实体类型。

std::cout << "Entity type " << enti->DynamicType()->Name() << std::endl;

当我在这里玩 STEP 文件时,我看到您的 STEP 行导致类型为 的实体StepBasic_SiUnitAndLengthUnit。使用此代码,我可以测试一些预期的 SI 单位:

if (enti->IsKind(STANDARD_TYPE(StepBasic_SiUnitAndLengthUnit)))
{
    Handle(StepBasic_SiUnitAndLengthUnit) unit =
            Handle(StepBasic_SiUnitAndLengthUnit)::DownCast(enti);

    if (unit->HasPrefix() &&
            (StepBasic_SiUnitName::StepBasic_sunMetre == unit->Name()) &&
            (StepBasic_SiPrefix::StepBasic_spMilli == unit->Prefix()))
    {
        std::cout << "SI Unit is millimetre." << std::endl;
    }
    else if (!unit->HasPrefix() &&
                     (StepBasic_SiUnitName::StepBasic_sunMetre == unit->Name()))
    {
        std::cout << "SI Unit is metre." << std::endl;
    }
    else
    {
        std::cout << "I did not understand that unit..." << std::endl;
    }
}
于 2020-07-23T07:25:12.817 回答