当我导入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;
}
}
}
有人知道这是否是正确的方法,或者是否有更好的方法。
答案 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;
}
}