> KonstantinM
Я это проверял и во всех случаях, с которыми я имел дело - это было правильно. Попробуй этот код:
static bool IsRightDirection(AcDbCurve *pCurv, AcGePoint3d p, AcGeVector3d vDir)
{
AcGeVector3d vNormal = AcGeVector3d::kZAxis;
if (pCurv->isPlanar()) {
AcDb::Planarity plan_type;
AcGePlane plane;
pCurv->getPlane(plane,plan_type);
vNormal = plane.normal();
p.project(plane,vDir);
}
AcGePoint3d pNear; pCurv->getClosestPointTo(p,pNear);
AcGeVector3d vSide = p - pNear,
vDeriv;
pCurv->getFirstDeriv(pNear,vDeriv);
if (vDeriv.crossProduct(vSide).dotProduct(vNormal) <= 0.0)
return true;
else
return false;
}
// - OffsetCurve.OffsetCurve command (do not rename)
static void OffsetCurveOffsetCurve(void)
{
// Add your code for command OffsetCurve.OffsetCurve here
double offset = 0;
AcGePoint3d p;
if (acedGetDist(NULL,"\nУкажите величину смещения: ",&offset) == RTNORM &&
acedGetPoint(NULL,"\nУкажите сторону смещения: ",asDblArray(p)) == RTNORM) {
acdbUcs2Wcs(asDblArray(p),asDblArray(p),false);
ads_name en;
ads_point p_ent;
if (acedEntSel("\nВыберите кривую: ",en,p_ent) == RTNORM) {
AcDbObjectId objId;
if (acdbGetObjectId(objId,en) == Acad::eOk) {
AcDbObjectPointer<AcDbCurve> pCurv(objId,AcDb::kForRead);
if (pCurv.openStatus() == Acad::eOk) {
AcGeVector3d vDir = AcGeVector3d::kZAxis;
resbuf rb; acedGetVar("viewdir",&rb);
if (rb.restype == RT3DPOINT) vDir = asVec3d(rb.resval.rpoint);
if (!IsRightDirection(pCurv.object(),p,vDir)) offset = -offset;
AcDbVoidPtrArray aCurvs;
if (pCurv->getOffsetCurves(offset,aCurvs) == Acad::eOk) {
for (int i=0; i < aCurvs.length(); i++) {
postToDwgAndClose(static_cast<AcDbEntity*>(aCurvs[i]));
}
}
}
}
}
}
}
Код postToDwgAndClose не привожу - он очевиден.