QT-CAD-3D显示操作工具
- 一、效果展示
- 二、核心程序
- 三、程序链接
一、效果展示
二、核心程序
TDF_LabelSequence DxfReader::transfer(DocumentPtr doc, TaskProgress* progress)
{TDF_LabelSequence seqLabel;Handle_XCAFDoc_ShapeTool shapeTool = doc->xcaf().shapeTool();Handle_XCAFDoc_ColorTool colorTool = doc->xcaf().colorTool();Handle_XCAFDoc_LayerTool layerTool = doc->xcaf().layerTool();std::unordered_map<std::string, TDF_Label> mapLayerNameLabel;std::unordered_map<ColorIndex_t, TDF_Label> mapAciColorLabel;auto fnAddRootShape = [&](const TopoDS_Shape& shape, const std::string& shapeName, TDF_Label layer) {const TDF_Label labelShape = shapeTool->NewShape();shapeTool->SetShape(labelShape, shape);TDataStd_Name::Set(labelShape, to_OccExtString(shapeName));seqLabel.Append(labelShape);if (!layer.IsNull())layerTool->SetLayer(labelShape, layer, true/*onlyInOneLayer*/);return labelShape;};auto fnAddAci = [&](ColorIndex_t aci) -> TDF_Label {auto it = mapAciColorLabel.find(aci);if (it != mapAciColorLabel.cend())return it->second;if (0 <= aci && CppUtils::cmpLess(aci, std::size(aciTable))) {const RGB_Color& c = aciTable[aci].second;const TDF_Label colorLabel = colorTool->AddColor(Quantity_Color(c.r / 255., c.g / 255., c.b / 255., Quantity_TOC_RGB));mapAciColorLabel.insert({ aci, colorLabel });return colorLabel;}return TDF_Label();};int iShape = 0;int shapeCount = 0;for (const auto& [layerName, vecEntity] : m_layers) {if (!startsWith(layerName, "BLOCKS")) {shapeCount = CppUtils::safeStaticCast<int>(shapeCount + vecEntity.size());const TDF_Label layerLabel = layerTool->AddLayer(to_OccExtString(layerName));mapLayerNameLabel.insert({ layerName, layerLabel });}}auto fnUpdateProgressValue = [&]{progress->setValue(MathUtils::toPercent(iShape, 0, shapeCount));};auto fnSetShapeColor = [=](const TDF_Label& labelShape, int aci) {const TDF_Label labelColor = fnAddAci(aci);if (!labelColor.IsNull())colorTool->SetColor(labelShape, labelColor, XCAFDoc_ColorGen);};if (!m_params.groupLayers) {for (const auto& [layerName, vecEntity] : m_layers) {if (startsWith(layerName, "BLOCKS"))continue; // Skipconst TDF_Label layerLabel = CppUtils::findValue(layerName, mapLayerNameLabel);for (const DxfReader::Entity& entity : vecEntity) {const std::string shapeName = std::string("Shape_") + std::to_string(++iShape);const TDF_Label shapeLabel = fnAddRootShape(entity.shape, shapeName, layerLabel);colorTool->SetColor(shapeLabel, fnAddAci(entity.aci), XCAFDoc_ColorGen);fnUpdateProgressValue();}}}else {for (const auto& [layerName, vecEntity] : m_layers) {if (startsWith(layerName, "BLOCKS"))continue; // SkipTopoDS_Compound comp = BRepUtils::makeEmptyCompound();for (const Entity& entity : vecEntity) {if (!entity.shape.IsNull())BRepUtils::addShape(&comp, entity.shape);}if (!comp.IsNull()) {const TDF_Label layerLabel = CppUtils::findValue(layerName, mapLayerNameLabel);const TDF_Label compLabel = fnAddRootShape(comp, layerName, layerLabel);// Check if all entities have the same colorbool uniqueColor = true;const ColorIndex_t aci = !vecEntity.empty() ? vecEntity.front().aci : -1;for (const Entity& entity : vecEntity) {uniqueColor = entity.aci == aci;if (!uniqueColor)break;}if (uniqueColor) {fnSetShapeColor(compLabel, aci);}else {for (const Entity& entity : vecEntity) {if (!entity.shape.IsNull()) {const TDF_Label entityLabel = shapeTool->AddSubShape(compLabel, entity.shape);fnSetShapeColor(entityLabel, entity.aci);}}}}iShape = CppUtils::safeStaticCast<int>(iShape + vecEntity.size());fnUpdateProgressValue();}}return seqLabel;
}std::unique_ptr<PropertyGroup> DxfReader::createProperties(PropertyGroup* parentGroup)
{return std::make_unique<Properties>(parentGroup);
}void DxfReader::applyProperties(const PropertyGroup* group)
{auto ptr = dynamic_cast<const Properties*>(group);if (ptr) {m_params.scaling = ptr->scaling;m_params.importAnnotations = ptr->importAnnotations;m_params.groupLayers = ptr->groupLayers;m_params.fontNameForTextObjects = ptr->fontNameForTextObjects.name();}
}void DxfReader::Internal::get_line()
{CDxfRead::get_line();m_fileReadSize += this->gcount();if (m_progress)m_progress->setValue(MathUtils::toPercent(m_fileReadSize, 0, m_fileSize));
}
![请添加图片描述](https://img-blog.csdnimg.cn/direct/4eb7d0d0da0f41cda08ee6bffe15a6ac.gif)
三、程序链接
https://download.csdn.net/download/u013083044/88628290