使用OpenCASCADE获取STEP CAD文件的长度比例因子

时间:2020-07-22 10:43:20

标签: scaling cad step opencascade

当我导入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;
    }
  }
}

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

1 个答案:

答案 0 :(得分: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;
    }
}