@cnngtdly wrote:
I found one of the AcdbSpline constructor,
Like the Spline commond in CAD, is there any way to draw a closed spline, I give the Points, and cad gives all the default params.
There are other AcDbSpline constructor's. For example:
AcDbSpline(const AcGePoint3dArray& points, int order = 4, double fitTolerance = 0.0);
If you have to do spline closed:
static Acad::ErrorStatus MakeSplineClosed(AcDbSpline *pSpline)
{
Acad::ErrorStatus es = Acad::eOk, esOpen = Acad::eOk;
AcGePoint3dArray fitPoints;
int degree;
double fitTolerance;
Adesk::Boolean tangentsExist;
Adesk::Boolean tangentStartDef;
Adesk::Boolean tangentEndDef;
AcGeVector3d startTangent;
AcGeVector3d endTangent;
Adesk::Boolean rational;
Adesk::Boolean closed;
Adesk::Boolean periodic;
AcGePoint3dArray controlPoints;
AcGeDoubleArray knots;
AcGeDoubleArray weights;
double controlPtTol;
double knotTol;
AcGeNurbCurve3d *curv = NULL;
if (pSpline->hasFitData()) {
AcGeTol tol;
if ((es = pSpline->getFitData(fitPoints,degree,fitTolerance,tangentsExist,startTangent,endTangent)) == Acad::eOk) {
tangentStartDef = tangentsExist && (startTangent != AcGeVector3d::kIdentity);
tangentEndDef = tangentsExist && (endTangent != AcGeVector3d::kIdentity);
AcGeTol fitTol; fitTol.setEqualPoint(fitTolerance);
curv = new AcGeNurbCurve3d(fitPoints, startTangent, endTangent, tangentStartDef, tangentEndDef, fitTol);
curv->makeClosed();
curv->getFitData(fitPoints, fitTol, tangentsExist, startTangent, endTangent);
if ((esOpen = pSpline->upgradeOpen()) == Acad::eOk || (esOpen == Acad::eWasOpenForWrite)) {
es = pSpline->setFitData(fitPoints, degree, fitTol. equalPoint(), startTangent, endTangent);
if (esOpen != Acad::eWasOpenForWrite) pSpline->downgradeOpen();
}
delete curv;
}
} else {
if ((es = pSpline->getNurbsData(degree, rational, closed, periodic, controlPoints, knots, weights, controlPtTol, knotTol)) == Acad::eOk) {
if ((esOpen = pSpline->upgradeOpen()) == Acad::eOk || (esOpen == Acad::eWasOpenForWrite)) {
es = pSpline->setNurbsData(degree, rational, Adesk::kTrue, periodic, controlPoints, knots, weights, controlPtTol, knotTol);
if (esOpen != Acad::eWasOpenForWrite) pSpline->downgradeOpen();
}
}
}
return es;
}
P.S.: This code was written 6 years ago and need to check it.
Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"
Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
