几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量

几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 (http://www.dimcax.com/hust/index.php)
-   DirectDWG (http://www.dimcax.com/hust/forumdisplay.php?f=89)
-   -   【转帖】oddbpolyline to odgepolyline3d and oddbspline to odgenurbcur (http://www.dimcax.com/hust/showthread.php?t=17581)

yang686526 2009-05-06 08:02 PM

【转帖】oddbpolyline to odgepolyline3d and oddbspline to odgenurbcur
 
oddbpolyline to odgepolyline3d and oddbspline to odgenurbcur
oddbpolyline to odgepolyline3d and oddbspline to odgenurbcurve3d
hi,
i want to create an odgepolyline3d from the given oddbpolyline. what steps should i follow. my second query is that i have got an oddbspline entity now i want to create odgenurbcurve3d or odgesplineent3d. my main objective is to get a closest point on the curve from a given point (polyline and spline). i want to know whether they are implemented for ge spline and ge polyline. as i could not get them by using function oddbcurve::getcloseestpointto() i think it is not implemented for oddb. please let me know....
thank you very much in advance....
.................................................. .................................................. ........
nitesh.................
.................................................. .................................................. ........

odgecurve3d::closestpointto() is implemented, but only in common case, this way:
code:
odgepoint3d odgecurve3d::closestpointto (const odgepoint3d& point, const odgetol& tol ) const
{
odgeinterval domain; getinterval(domain);
if ( !domain.isbounded() ) throw oderror(enotimplemented); // should be implemented in descendant
odgepoint3darray smplpts;
odgedoublearray smplparams;
getsamplepoints(domain.lowerbound(), domain.upperbound(), tol.equalpoint(), smplpts, &smplparams);
if ( !smplpts.size() ) throw oderror(edegenerategeometry);
odgepoint3d res;
double dist = std::numeric_limits<double>::max();
for ( oduint32 i = 1; i < smplpts.size(); ++i )
{
odgelineseg3d seg(smplpts[i-1],smplpts[i]);
odgepoint3d p = seg.closestpointto( point, tol );
double l = (point - p).lengthsqrd();
if ( l < dist )
{
res = p;
dist = l;
}
}
return res;
}
for specific curves (e.g. odgepolyline3d, odgenurbcurve3d) more effective implementation is possible, but we don't have specific implementation yet.
btw, you can implement oddbcurve::getcloseestpointto() using protocol extensions - see odcurvefunctions sample.
sincerely yours,
george udov

thanks for reply george...
i want to know about one more thing. we know oddbpolyline has got segment type line and arc. does odgepolyline3d is similar to oddbpolyline? what i mean to say that does it supports line and arc segments.. and if yes then please can you suggest how will i create a odgepolyline3d, if i already have a oddbpolyline object.
thanks...

1) 3d polylines, in general, can't have arc segments. so odgepolyline3d can't have arc segments. odgepolyline2d can have arc segments, so you can convert ocs representation of oddbpolyline to odgepolyline2d.
2) odgepolyline2d has methods vertices() and bulges(). using these methods you can propagate ocs vertices and bulges from oddbpolyline to odgepolyline2d.
3) you can get ocs vertices and bulges from oddbpolyline using methods numverts(), getbulgeat(), getpointat().
4) note that oddbpolyline can have widths. neither odgepolyline2d nor odgepolyline3d can't have widths. so in common case there is no bijection between oddbpolyline and odgepolyline-s.
5) unfortunately, closestpointto() functionality is not implemented yet for odgecurve2d.
sincerely yours,
george udov
thanks alot george for the info....


所有的时间均为北京时间。 现在的时间是 05:08 AM.