/*************************************************************************** * Copyright (c) 2020 WandererFan # include # include # include #endif #include #include #include "LandmarkDimension.h" #include "DrawUtil.h" #include "DrawViewPart.h" #include "ShapeExtractor.h" using namespace TechDraw; //=========================================================================== // LandmarkDimension //=========================================================================== PROPERTY_SOURCE(TechDraw::LandmarkDimension, TechDraw::DrawViewDimension) LandmarkDimension::LandmarkDimension() { static const char *group = "Landmark"; //this leaves a blank entry in position 1. ADD_PROPERTY_TYPE(ReferenceTags, ("") , group, App::Prop_Output, "Tags of Dimension Endpoints"); std::vector noTags; ReferenceTags.setValues(noTags); } LandmarkDimension::~LandmarkDimension() { } void LandmarkDimension::onChanged(const App::Property* prop) { if (!isRestoring()) { //this is only good for new RD creation, not restore from disk? if (prop == &References3D) { //handled in base class } else if (prop == &ReferenceTags) { //??? } } DrawViewDimension::onChanged(prop); } short LandmarkDimension::mustExecute() const { return DrawViewDimension::mustExecute(); } App::DocumentObjectExecReturn *LandmarkDimension::execute() { Base::Console().Message("LD::execute() - %s\n", getNameInDocument()); if (!keepUpdated()) { return App::DocumentObject::StdReturn; } DrawViewPart* dvp = getViewPart(); if (!dvp) { return App::DocumentObject::StdReturn; } References2D.setValue(dvp); std::vector features = References3D.getValues(); Base::Console().Message("LD::execute - features: %d\n", features.size()); //if distance, required size = 2 //if angle, required size = 3; //not implemented yet unsigned int requiredSize = 2; if (features.size() < requiredSize) { return App::DocumentObject::StdReturn; } std::vector points; std::vector reprs = ReferenceTags.getValues(); if (reprs.empty()) { //add verts to dvp & vert tags to RD for (auto& f: features) { Base::Vector3d loc3d = ShapeExtractor::getLocation3dFromFeat(f); Base::Vector3d loc2d = projectPoint(loc3d, dvp) * dvp->getScale(); points.push_back(loc2d); std::string tag = dvp->addReferenceVertex(loc2d); reprs.push_back(tag); } ReferenceTags.setValues(reprs); } else { //update dvp referenceverts locations int index = 0; for (auto& f: features) { Base::Vector3d loc3d = ShapeExtractor::getLocation3dFromFeat(f); Base::Vector3d loc2d = projectPoint(loc3d, dvp) * dvp->getScale(); points.push_back(loc2d); dvp->updateReferenceVert(reprs.at(index), loc2d); //sb by tag index++; } } Base::Console().Message("LD::execute - front: %s back: %s\n", DrawUtil::formatVector(points.front()).c_str(), DrawUtil::formatVector(points.back()).c_str()); setLinearPoints(points.front(), points.back()); App::DocumentObjectExecReturn* dvdResult = DrawViewDimension::execute(); dvp->addReferencesToGeom(); dvp->requestPaint(); overrideKeepUpdated(false); return dvdResult; } Base::Vector3d LandmarkDimension::projectPoint(const Base::Vector3d& pt, DrawViewPart* dvp) const { Base::Vector3d stdOrg(0.0, 0.0, 0.0); gp_Ax2 viewAxis = dvp->getProjectionCS(stdOrg); Base::Vector3d alignedPt = pt - dvp->getOriginalCentroid(); gp_Pnt gPt(alignedPt.x, alignedPt.y, alignedPt.z); HLRAlgo_Projector projector( viewAxis ); gp_Pnt2d prjPnt; projector.Project(gPt, prjPnt); Base::Vector3d result(prjPnt.X(), prjPnt.Y(), 0.0); result = DrawUtil::invertY(result); return result; } int LandmarkDimension::getRefType() const { //TODO: need changes here when other reference dim types added return DrawViewDimension::RefType::twoVertex; } DrawViewPart* LandmarkDimension::getViewPart() const { DrawViewPart* result = nullptr; std::vector refs2d = References2D.getValues(); App::DocumentObject* obj = refs2d.front(); DrawViewPart* dvp = dynamic_cast(obj); if (dvp) { result = dvp; } return result; } void LandmarkDimension::onDocumentRestored() { DrawViewPart* dvp = getViewPart(); std::vector features = References3D.getValues(); std::vector points; std::vector tags; //add verts to dvp & vert tags to RD for (auto& f: features) { Base::Vector3d loc3d = ShapeExtractor::getLocation3dFromFeat(f); Base::Vector3d loc2d = projectPoint(loc3d, dvp) * dvp->getScale(); points.push_back(loc2d); std::string tag = dvp->addReferenceVertex(loc2d); tags.push_back(tag); } ReferenceTags.setValues(tags); setLinearPoints(points.front(), points.back()); DrawViewDimension::onDocumentRestored(); } void LandmarkDimension::unsetupObject() { TechDraw::DrawViewPart* dvp = getViewPart(); std::vector tags = ReferenceTags.getValues(); for (auto& t: tags) { dvp->removeReferenceVertex(t); } dvp->resetReferenceVerts(); dvp->requestPaint(); }