高级会员
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
|
【转帖】bug with closed splines
bug with closed splines
bug with closed splines
hi,
here is a bug with closed splines:
code:
//set a closed spline
bool bclosed = true;
//interpolation arg set to 3
int ndegree = 3;
oddbdatabase* pdb = getdocument()->m_pdb;
{
//create a spline object
oddbsplineptr pspline = oddbspline::createobject();
oddbblocktablerecordptr pbtr = pdb->getactivelayoutbtrid().safeopenobject(oddb::kforwrite);
pbtr->appendoddbentity(pspline2);
//initialize points for the spline curve
odgepoint3darray nurbpoints;
nurbpoints.push_back(odgepoint3d(0.0,0.0,0.0));
nurbpoints.push_back(odgepoint3d(50.0,-50.0,0));
nurbpoints.push_back(odgepoint3d(100.0,0.0,0.0));
nurbpoints.push_back(odgepoint3d(50.0,50.0,0));
nurbpoints.push_back(odgepoint3d(-25.0,0.0,0.0));
odgedoublearray knots,weights;
unsigned int n = 0;
//for a closed spline...
if (bclosed){
...set nunb and knots arrays
nurbpoints.insert(nurbpoints.end(),nurbpoints.begin(),nurbpoints.begin() + ndegree);
n = nurbpoints.size();
knots.resize(n + ndegree + 1);
for (unsigned int i=0; i<n+ndegree+1; ++i) knots[i] = i;
}
weights.resize(n,1.0);
//purge all fit data if available
pspline->purgefitdata();
const bool brational = false;
//set spline to rational,closed and periodic
pspline->setnurbsdata(ndegree,brational,bclosed,true,nurbpoints,knots,weights,0.,0.);
}
1.save the drawing in odamfc
2.open and save in autocad
3.load back in odamfc => an error occurs.(the flags are set to 0, knots numbers are different, and weights are missing)
if ndegree set to 4 it work correctly only for 4-point input array.
is it a dwgdirect bug or there should be other way to create the spline?
thanks in advance for any help.
best regards
chudomir
i don't hav much of idea.. but the below is mentioned in the dwgdirect reference.chm
if isperiodic is true, then knots.length() must equal controlpoints.length(), the first and last controlpoints must be equal and the first and last weights (if provided) must be equal.
so da change may b....
n = nurbpoints.size();
knots.resize(n);
or (unsigned int i=0; i<n; ++i) knots[i] = i;
.................................................. .
.................................................. .........................
thanks a lot for the info, but i have some errors when i try to created a closed spline in this way.
may be dwgdirect guys would help here...
best regards
chudomir
dear chudomir,
i think, there are several issues:
1) you pass to oddbspline::setnurbsdata non-empty weights array. oddbspline::setnurbsdata doesn't analyze "rational" parameter, it just creates rational spline in case weigths array is not empty. this is dd minor issue, it will be fixed in 1.15.
2) such splines (that doesn't have "rational" flag, but have weights array) are written by autocad in dwg in some untypical manner. we didn't see such files yet. we have some minor problems with reading them; they'll be fixed in 1.15.
3) autocad itself has some problems with rational closed splines, having knot vector, that doesn't have repeated (degree+1) knots on ends.
the way to solve your concrete issue - to pass empty odgedoublearray() instead array of "1.0" for weights.
sincerely yours,
george udov
thanks for your time george - it works now!!
best regards
chudomir
|