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; // Skip
const 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; // Skip
TopoDS_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 color
bool 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