| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #include "lc_dimarrowregistry.h" |
| |
|
| | #include "lc_arrow_box.h" |
| | #include "lc_arrow_circle.h" |
| | #include "lc_arrow_datum.h" |
| | #include "lc_arrow_dot.h" |
| | #include "lc_arrow_headclosed.h" |
| | #include "lc_arrow_headclosed_blank.h" |
| | #include "lc_arrow_headopen.h" |
| | #include "lc_arrow_integral.h" |
| | #include "lc_arrow_none.h" |
| | #include "lc_arrow_tick.h" |
| | #include "rs_arc.h" |
| | #include "rs_block.h" |
| | #include "rs_blocklist.h" |
| | #include "rs_circle.h" |
| | #include "rs_creation.h" |
| | #include "rs_entitycontainer.h" |
| | #include "rs_graphic.h" |
| | #include "rs_insert.h" |
| | #include "rs_line.h" |
| | #include "rs_math.h" |
| | #include "rs_solid.h" |
| | #include "rs_vector.h" |
| |
|
| | LC_DimArrowRegistry::LC_DimArrowRegistry() { |
| | init(); |
| | } |
| |
|
| | std::vector<LC_DimArrowRegistry::ArrowInfo> LC_DimArrowRegistry::m_defaultArrowsInfo; |
| |
|
| | QString LC_DimArrowRegistry::ArrowInfo::ARROW_TYPE_OBLIQUE = "_OBLIQUE"; |
| | QString LC_DimArrowRegistry::ArrowInfo::ARROW_TYPE_ARCHTICK = "_ARCHTICK"; |
| |
|
| | bool LC_DimArrowRegistry::isStandardBlockName(const QString& blockName) { |
| | init(); |
| | for (const auto& info : m_defaultArrowsInfo) { |
| | if (info.blockName.compare(blockName, Qt::CaseInsensitive) == 0) { |
| | return true; |
| | } |
| | } |
| | return false; |
| | } |
| |
|
| | bool LC_DimArrowRegistry::getArrowInfoByBlockName(const QString& blockName, ArrowInfo& found) { |
| | init(); |
| | for (const auto& info : m_defaultArrowsInfo) { |
| | if (info.blockName.compare(blockName, Qt::CaseInsensitive) == 0) { |
| | found = info; |
| | return true; |
| | } |
| | } |
| | return false; |
| | } |
| |
|
| | bool LC_DimArrowRegistry::getArrowInfoByType(const ArrowType type, ArrowInfo& found) { |
| | init(); |
| | for (const auto& info : m_defaultArrowsInfo) { |
| | if (info.type == type) { |
| | found = info; |
| | return true; |
| | } |
| | } |
| | return false; |
| | } |
| |
|
| | std::pair<RS_Entity*, double> LC_DimArrowRegistry::createArrowBlock(RS_EntityContainer* container, |
| | const QString& blockName, const RS_Vector& point, |
| | double directionAngle, double arrowSize) { |
| | auto graphic = container->getGraphic(); |
| | ArrowInfo info; |
| | if (graphic != nullptr) { |
| | RS_BlockList* blocksList = graphic->getBlockList(); |
| | auto customBlock = blocksList->findCaseInsensitive(blockName); |
| | if (customBlock != nullptr) { |
| | double dimLineExtension = 0.0; |
| | |
| | |
| | if (getArrowInfoByBlockName(blockName, info)) { |
| | dimLineExtension = info.dimLineCorrection; |
| | } |
| | auto blockEntity = createCustomArrowBlock(container, customBlock->getName(), point, directionAngle, |
| | arrowSize); |
| | return {blockEntity, dimLineExtension}; |
| | } |
| | } |
| |
|
| | bool hasArrowType = getArrowInfoByBlockName(blockName, info); |
| | if (!hasArrowType) { |
| | info = m_defaultArrowsInfo[0]; |
| | } |
| | auto blockEntity = createDefaultArrowBlock(container, info.type, point, directionAngle, arrowSize); |
| | return {blockEntity, 0.0}; |
| | } |
| |
|
| | RS_Entity* LC_DimArrowRegistry::createDefaultArrowBlock(RS_EntityContainer* container, ArrowType type, |
| | const RS_Vector& point, |
| | double directionAngle, double arrowSize) { |
| | switch (type) { |
| | case (closed_filled): { |
| | return new LC_ArrowHeadClosed(container, point, directionAngle, arrowSize, 0.165, true); |
| | } |
| | case (dot): { |
| | return new LC_ArrowCircle(container, point, directionAngle, arrowSize, LC_ArrowCircle::dot); |
| | } |
| | case (dot_small): { |
| | return new LC_ArrowDot(container, point, directionAngle, arrowSize, LC_ArrowDot::blank); |
| | } |
| | case (dot_blank): { |
| | return new LC_ArrowCircle(container, point, directionAngle, arrowSize, LC_ArrowCircle::dot_blank); |
| | } |
| | case (origin_indicator): { |
| | return new LC_ArrowCircle(container, point, directionAngle, arrowSize, LC_ArrowCircle::origin_indicator); |
| | } |
| | case (origin_indicator_2): { |
| | return new LC_ArrowCircle(container, point, directionAngle, arrowSize, LC_ArrowCircle::origin_indicator2); |
| | } |
| | case (open): { |
| | return new LC_ArrowHeadOpen(container, point, directionAngle, arrowSize, 0.165); |
| | } |
| | case (right_angle): { |
| | return new LC_ArrowHeadOpen(container, point, directionAngle, arrowSize, 0.785398); |
| | } |
| | case (open_30): { |
| | return new LC_ArrowHeadOpen(container, point, directionAngle, arrowSize, 0.261799); |
| | } |
| | case (closed): { |
| | return new LC_ArrowHeadClosed(container, point, directionAngle, arrowSize, 0.165, false); |
| | } |
| | case (dot_small_blank): { |
| | return new LC_ArrowDot(container, point, directionAngle, arrowSize, LC_ArrowDot::blank); |
| | } |
| | case (none): { |
| | return new LC_ArrowNone(container, point, directionAngle, arrowSize); |
| | } |
| | case (oblique): { |
| | return new LC_ArrowTick(container, point, directionAngle, arrowSize, false); |
| | } |
| | case (box_filled): { |
| | return new LC_ArrowBox(container, point, directionAngle, arrowSize, true); |
| | } |
| | case (box): { |
| | return new LC_ArrowBox(container, point, directionAngle, arrowSize, false); |
| | } |
| | case (closed_blank): { |
| | return new LC_ArrowHeadClosedBlank(container, point, directionAngle, arrowSize, 0.165); |
| | } |
| | case (datum_triangle_filled): { |
| | return new LC_ArrowDatum(container, point, directionAngle, arrowSize, true); |
| | } |
| | case (datum_triangle): { |
| | return new LC_ArrowDatum(container, point, directionAngle, arrowSize, false); |
| | } |
| | case (integral): { |
| | return new LC_ArrowIntegral(container, point, directionAngle, arrowSize); |
| | } |
| | case (architectural_tick): { |
| | return new LC_ArrowTick(container, point, directionAngle, arrowSize, true); |
| | } |
| | default: |
| | break; |
| | } |
| | return nullptr; |
| | } |
| |
|
| | RS_Entity* LC_DimArrowRegistry::createCustomArrowBlock(RS_EntityContainer* container, QString blockName, |
| | const RS_Vector& point, double direction_angle, |
| | double arrowSize) { |
| | auto insertData = new RS_InsertData(blockName, point, RS_Vector(arrowSize, arrowSize), direction_angle, |
| | 1, 1, RS_Vector(0, 0), nullptr, RS2::Update); |
| |
|
| | auto ins = new RS_Insert(container, *insertData); |
| | return ins; |
| | } |
| |
|
| | void LC_DimArrowRegistry::init() { |
| | if (m_defaultArrowsInfo.empty()) { |
| | m_defaultArrowsInfo = { |
| | {"", closed_filled, tr("Closed Filled"), 0.0}, |
| | |
| | |
| | {"_DOT", dot, tr("Dot"), 0.0}, |
| | {"_DOTSMALL", dot_small, tr("Dot Small"), 1.0}, |
| | {"_DOTBLANK", dot_blank, tr("Dot Blank"), 0.0}, |
| | {"_ORIGIN", origin_indicator, tr("Origin Indicator"), 0.0}, |
| | {"_ORIGIN2", origin_indicator_2, tr("Origin Indicator 2"), 0.0}, |
| | {"_OPEN", open, tr("Open"), 0.0}, |
| | {"_OPEN90", right_angle, tr("Right Angle"), 0.0}, |
| | {"_OPEN30", open_30, tr("Open 30"), 0.0}, |
| | {"_CLOSED", closed, tr("Closed"), 0.0}, |
| | {"_SMALL", dot_small_blank, tr("Dot Small Blank"), 1}, |
| | {"_NONE", none, tr("None"), 1.0}, |
| | {ArrowInfo::ARROW_TYPE_OBLIQUE, oblique, tr("Oblique"), 1.0}, |
| | {"_BOXFILLED", box_filled, tr("Box Filled"), 0.0}, |
| | {"_BOXBLANK", box, tr("Box Blank"), 0.0}, |
| | {"_CLOSEDBLANK", closed_blank, tr("Closed Blank"), 0.0}, |
| | {"_DATUMFILLED", datum_triangle_filled, tr("Datum Filled"), 0.0}, |
| | {"_DATUMBLANK", datum_triangle, tr("Datum Blank"), 0.0}, |
| | {"_INTEGRAL", integral, tr("Integral"), 1.0}, |
| | {ArrowInfo::ARROW_TYPE_ARCHTICK, architectural_tick, tr("Architecture Tick"), 1.0} |
| | }; |
| | } |
| | } |
| |
|
| | void LC_DimArrowRegistry::insertStandardArrowBlocks(RS_EntityContainer* container) { |
| | auto graphic = container->getGraphic(); |
| | ArrowInfo info; |
| | if (graphic != nullptr) { |
| | RS_BlockList* blocksList = graphic->getBlockList(); |
| | for (auto arrowInfo : m_defaultArrowsInfo) { |
| | insertStandardArrowBlock(container, blocksList, arrowInfo); |
| | } |
| | } |
| | } |
| |
|
| | void LC_DimArrowRegistry::fillArrowBlockByEntities(RS_Block* block, ArrowType arrow) { |
| | switch (arrow) { |
| | case closed_filled: { |
| | block->addByBlockEntity(new RS_Solid({{0.0, 0.0}, {-1.0, 0.1667}, {-1.0, -0.1667}})); |
| | break; |
| | } |
| | case dot: { |
| | block->addByBlockLine({-1.0, 0.0}, {-0.5, 0.0}); |
| | block->addByBlockEntity(new RS_Circle({{0.0, 0.0}, 0.25})); |
| | break; |
| | } |
| | case dot_small: { |
| | block->addByBlockEntity(new RS_Circle({{0.0, 0.0}, 0.0625})); |
| | break; |
| | } |
| | case dot_blank: { |
| | block->addByBlockLine({-1.0, 0.0}, {-0.5, 0.0}); |
| | block->addByBlockEntity(new RS_Circle({{0.0, 0.0}, 0.5})); |
| | break; |
| | } |
| | case origin_indicator: { |
| | block->addByBlockLine({0.0, 0.0}, {-1.0, 0.0}); |
| | block->addByBlockEntity(new RS_Circle({{0.0, 0.0}, 0.5})); |
| | break; |
| | } |
| | case origin_indicator_2: { |
| | block->addByBlockLine({-1.0, 0.0}, {-0.5, 0.0}); |
| | block->addByBlockEntity(new RS_Circle({{0.0, 0.0}, 0.5})); |
| | block->addByBlockEntity(new RS_Circle({{0.0, 0.0}, 0.25})); |
| | break; |
| | } |
| | case open: { |
| | block->addByBlockLine({-1.0, 0.1667}, {0.0, 0.0}); |
| | block->addByBlockLine({-1.0, 0.0}, {0.0, 0.0}); |
| | block->addByBlockLine({-1.0, -0.1667}, {0.0, 0.0}); |
| | break; |
| | } |
| | case right_angle: { |
| | block->addByBlockLine({-0.5, 0.5}, {0.0, 0.0}); |
| | block->addByBlockLine({-1.0, 0.0}, {0.0, 0.0}); |
| | block->addByBlockLine({-0.5, -0.5}, {0.0, 0.0}); |
| | break; |
| | } |
| | case open_30: { |
| | block->addByBlockLine({-1.0, 0.2679}, {0.0, 0.0}); |
| | block->addByBlockLine({-1.0, 0.0}, {0.0, 0.0}); |
| | block->addByBlockLine({-1.0, -0.2679}, {0.0, 0.0}); |
| | break; |
| | } |
| | case closed: { |
| | block->addByBlockLine({0.0, 0.0}, {-1.0, 0.0}); |
| | block->addByBlockLine({0.0, 0.0}, {-1.0, 0.1667}); |
| | block->addByBlockLine({-1.0, 0.1667}, {-1.0, -0.1667}); |
| | block->addByBlockLine({-1.0, -0.1667}, {0.0, 0.0}); |
| | break; |
| | } |
| | case dot_small_blank: { |
| | block->addByBlockEntity(new RS_Circle({{0.0, 0.0}, 0.25})); |
| | break; |
| | } |
| | case none: { |
| | break; |
| | } |
| | case oblique: { |
| | block->addByBlockLine({-0.5, -0.5}, {0.5, 0.5}); |
| | break; |
| | } |
| | case box_filled: { |
| | |
| | block->addByBlockEntity(new RS_Solid({{-0.5, -0.5}, {-0.5, 0.5}, {0.5, -0.5}, {0.5, 0.5}})); |
| | block->addByBlockLine({-0.5, 0.0}, {-1.0, 0.0}); |
| | break; |
| | } |
| | case box: { |
| | block->addByBlockLine({0.5, -0.5}, {0.5, 0.5}); |
| | block->addByBlockLine({0.5, 0.5}, {-0.5, 0.5}); |
| | block->addByBlockLine({-0.5, 0.5}, {-0.5, -0.5}); |
| | block->addByBlockLine({-0.5, -0.5}, {0.5, -0.5}); |
| | block->addByBlockLine({-0.5, 0.0}, {-1.0, 0.0}); |
| | break; |
| | } |
| | case closed_blank: { |
| | block->addByBlockLine({0.0, 0.0}, {-1.0, 0.1667}); |
| | block->addByBlockLine({-1.0, 0.1667}, {-1.0, -0.1667}); |
| | block->addByBlockLine({-1.0, -0.1667}, {0.0, 0.0}); |
| | break; |
| | } |
| | case datum_triangle_filled: { |
| | block->addByBlockEntity(new RS_Solid({{0.0, -0.5774}, {0.0, 0.5774}, {-1.0, 0}})); |
| | break; |
| | } |
| | case datum_triangle: { |
| | block->addByBlockLine({0.0, -0.5774}, {0.0, 0.5774}); |
| | block->addByBlockLine({0.0, 0.5774}, {-1.0, 0}); |
| | block->addByBlockLine({-1.0, 0.0}, {0.0, -0.5774}); |
| | break; |
| | } |
| | case integral: { |
| | RS_ArcData data1({-0.4449, 0.0913}, 0.4542, RS_Math::deg2rad(282), RS_Math::deg2rad(348), false); |
| | block->addByBlockEntity(new RS_Arc(data1)); |
| |
|
| | RS_ArcData data2({0.4449, -0.0913}, 0.4542, RS_Math::deg2rad(66), RS_Math::deg2rad(168), false); |
| | block->addByBlockEntity(new RS_Arc(data2)); |
| | break; |
| | } |
| | case architectural_tick: { |
| | block->addByBlockLine({-0.5, -0.5}, {0.5, 0.5}); |
| | break; |
| | } |
| | default: |
| | break; |
| | } |
| | } |
| |
|
| | void LC_DimArrowRegistry::insertStandardArrowBlock(RS_EntityContainer* container, RS_BlockList* blocksList, |
| | LC_DimArrowRegistry::ArrowInfo arrowInfo) { |
| | QString blockName = arrowInfo.blockName; |
| | auto customBlock = blocksList->findCaseInsensitive(blockName); |
| | if (customBlock == nullptr) { |
| | RS_BlockData d = RS_BlockData(blockName, RS_Vector(0.0, 0.0), false); |
| | customBlock = new RS_Block(container, d); |
| | customBlock->setAutoUpdateBorders(false); |
| | fillArrowBlockByEntities(customBlock, arrowInfo.type); |
| | blocksList->add(customBlock, true); |
| | } |
| | } |
| |
|
| | void LC_DimArrowRegistry::insertStandardArrowBlock(RS_EntityContainer* container, RS_BlockList* blocksList, |
| | LC_DimArrowRegistry::ArrowInfo* arrowInfo) { |
| | QString blockName = arrowInfo->name; |
| | RS_BlockData d = RS_BlockData(blockName, RS_Vector(0.0, 0.0), false); |
| | auto customBlock = new RS_Block(container, d); |
| | customBlock->setAutoUpdateBorders(false); |
| | fillArrowBlockByEntities(customBlock, arrowInfo->type); |
| | blocksList->add(customBlock, false); |
| | } |
| |
|
| | void LC_DimArrowRegistry::insertStandardArrowBlocks(RS_Graphic* graphic, const QList<LC_DimStyle*>& styles) { |
| | auto blockList = graphic->getBlockList(); |
| | auto container = graphic->getDocument(); |
| | QSet<QString> uniqueArrowBlockNames; |
| | collectUsedArrowTypes(styles, uniqueArrowBlockNames); |
| |
|
| | for (const auto& blockName : uniqueArrowBlockNames) { |
| | if (blockList->findCaseInsensitive(blockName) == nullptr) { |
| | ArrowInfo info; |
| | if (getArrowInfoByBlockName(blockName, info)) { |
| | insertStandardArrowBlock(container, blockList, info); |
| | } |
| | } |
| | } |
| | } |
| |
|
| | void LC_DimArrowRegistry::collectUsedArrowTypes(const QList<LC_DimStyle*>& list, QSet<QString>& uniqueArrowBlockNames) { |
| | for (auto dimStyle : list) { |
| | auto arrowhead = dimStyle->arrowhead(); |
| | QString firstArrowBlockName = arrowhead->arrowHeadBlockNameFirst(); |
| | QString secondArrowBlockName = arrowhead->arrowHeadBlockNameSecond(); |
| | QString sameArrowBlockName = arrowhead->sameBlockName(); |
| | QString leaderName = dimStyle->leader()->arrowBlockName(); |
| |
|
| | if (!firstArrowBlockName.isEmpty()) { |
| | uniqueArrowBlockNames << firstArrowBlockName; |
| | } |
| | if (!secondArrowBlockName.isEmpty()) { |
| | uniqueArrowBlockNames << secondArrowBlockName; |
| | } |
| | if (!sameArrowBlockName.isEmpty()) { |
| | uniqueArrowBlockNames << sameArrowBlockName; |
| | } |
| | if (!leaderName.isEmpty()) { |
| | uniqueArrowBlockNames << leaderName; |
| | } |
| | } |
| |
|
| | |
| | if (uniqueArrowBlockNames.contains("_CLOSEDFILLED")) { |
| | uniqueArrowBlockNames.remove("_CLOSEDFILLED"); |
| | } |
| | } |
| |
|
| | void LC_DimArrowRegistry::insertStandardArrowBlock(RS_EntityContainer* container, |
| | RS_BlockList* blocksList, |
| | ArrowType arrowType) { |
| | ArrowInfo arrowInfo; |
| | if (getArrowInfoByType(arrowType, arrowInfo)) { |
| | insertStandardArrowBlock(container, blocksList, arrowInfo); |
| | } |
| | } |
| |
|
| | void LC_DimArrowRegistry::fillDefaultArrowTypes(std::vector<ArrowInfo>& arrowTypes) { |
| | init(); |
| | for (auto at : m_defaultArrowsInfo) { |
| | QString blockName = at.blockName; |
| | if (blockName.isEmpty()) { |
| | blockName = "_CLOSEDFILLED"; |
| | } |
| | ArrowInfo arrowType(blockName, at.type, at.name, at.dimLineCorrection); |
| | arrowTypes.push_back(arrowType); |
| | } |
| | } |
| |
|
| | bool LC_DimArrowRegistry::isObliqueOrArchArrow(const QString& blockName) { |
| | return blockName.compare(ArrowInfo::ARROW_TYPE_OBLIQUE, Qt::CaseInsensitive) == 0 || |
| | blockName.compare(ArrowInfo::ARROW_TYPE_ARCHTICK, Qt::CaseInsensitive) == 0; |
| | } |
| |
|