void RPolyline::appendShape(const RShape& shape, bool prepend) { // const RDirected* directed = dynamic_cast<const RDirected*>(&shape); // if (directed==NULL) { // qWarning() << "RPolyline::appendShape: shape is not a line, arc or polyline: " << shape; // return; // } const RPolyline* pl = dynamic_cast<const RPolyline*>(&shape); if (pl!=NULL) { if (prepend) { for (int i=pl->countSegments()-1; i>=0; --i) { QSharedPointer<RShape> s = pl->getSegmentAt(i); if (s.isNull()) { continue; } prependShape(*s); } } else { for (int i=0; i<pl->countSegments(); ++i) { QSharedPointer<RShape> s = pl->getSegmentAt(i); if (s.isNull()) { continue; } appendShape(*s); } } return; } const RDirected* directed = NULL; double bulge = 0.0; const RLine* line = dynamic_cast<const RLine*>(&shape); if (line!=NULL) { directed = line; } else { const RArc* arc = dynamic_cast<const RArc*>(&shape); if (arc!=NULL) { bulge = arc->getBulge(); directed = arc; } } if (directed==NULL) { qWarning() << "RPolyline::appendShape: shape is not a line, arc or polyline: " << shape; return; } RVector connectionPoint; RVector nextPoint; double gap; if (prepend) { connectionPoint = directed->getEndPoint(); nextPoint = directed->getStartPoint(); if (vertices.size()==0) { appendVertex(connectionPoint); } gap = vertices.first().getDistanceTo(connectionPoint); } else { connectionPoint = directed->getStartPoint(); nextPoint = directed->getEndPoint(); if (vertices.size()==0) { appendVertex(connectionPoint); } gap = vertices.last().getDistanceTo(connectionPoint); } if (!RMath::fuzzyCompare(gap, 0.0, 1.0e-4)) { qWarning() << "RPolyline::appendShape: arc or line not connected to polyline, gap: " << gap; } if (prepend) { prependVertex(nextPoint); setBulgeAt(0, bulge); } else { appendVertex(nextPoint); setBulgeAt(bulges.size()-2, bulge); } }
bool RPolylineData::moveReferencePoint(const RVector& referencePoint, const RVector& targetPoint) { bool ret = false; QList<RVector>::iterator it; for (it=vertices.begin(); it!=vertices.end(); ++it) { if (referencePoint.equalsFuzzy(*it)) { (*it) = targetPoint; ret = true; } } for (int i=0; i<countSegments(); i++) { if (isArcSegmentAt(i)) { QSharedPointer<RArc> arc = getSegmentAt(i).dynamicCast<RArc>(); if (!arc.isNull()) { if (referencePoint.equalsFuzzy(arc->getMiddlePoint())) { RArc a = RArc::createFrom3Points(arc->getStartPoint(), targetPoint, arc->getEndPoint()); setBulgeAt(i, a.getBulge()); ret = true; } } } } return ret; }
void RPolyline::appendShape(const RShape& shape) { const RDirected* directed = dynamic_cast<const RDirected*>(&shape); if (directed==NULL) { qWarning("RPolyline::appendShape: shape is not a line, arc or polyline"); return; } const RPolyline* pl = dynamic_cast<const RPolyline*>(&shape); if (pl!=NULL) { for (int i=0; i<pl->countSegments(); ++i) { QSharedPointer<RShape> s = pl->getSegmentAt(i); if (s.isNull()) { continue; } appendShape(*s.data()); } } double bulge = 0.0; const RArc* arc = dynamic_cast<const RArc*>(&shape); if (arc!=NULL) { bulge = arc->getBulge(); } if (vertices.size()==0) { appendVertex(directed->getStartPoint()); } appendVertex(directed->getEndPoint()); setBulgeAt(bulges.size()-2, bulge); }