![]() |
【转帖】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 |
所有的时间均为北京时间。 现在的时间是 09:23 AM. |