- UID
- 1
- 积分
- 16111
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-1-3
- 最后登录
- 1970-1-1
|
发表于 2002-2-21 12:30:17
|
显示全部楼层
最初由 Lagier 发布
[B]XD:
程序没有问题,在ACAD里面交互能得到正确图形,但不知是哪里的问题,还请XD或何版主将函数试用一下。谢谢! [/B]
下面是XDRX_API的XDRX_GETOFFSETCURVES函数代码,偏移AcDbCurve实体,最后得到样本点表.你参考下,看看.
还有,OFFSET后的实体不一定是一个,有可能是多个.所以仅仅是curves[0]不够的. 再有,是否你的postToDb函数内有问题,还有你偏移的是什么实体?
- int getoffsetcurve()
- {
- resbuf *rb=ads_getargs();
- AcGePoint3d start_pt,end_pt;
- if (rb==NULL)
- return RTNORM;
- if (rb->restype!=RTENAME)
- return RTNORM;
- AcDbObjectId id;
- acdbGetObjectId(id,rb->resval.rlname);
- AcDbEntity *pEnt;
- Acad::ErrorStatus ret;
- ret=acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead);
- if (ret!=Acad::eOk)
- return RTNORM;
- AcDbCurve *pCurve,*pOffsetCurve;
- if ((pCurve=AcDbCurve::cast(pEnt))==NULL){
- pEnt->close();
- return RTNORM;
- }
- double c_length,sParam,eParam,dist=0;
- resbuf vs;
- ads_getvar("VIEWSIZE",&vs);
- dist=vs.resval.rreal/15.0;
- pCurve->getStartParam(sParam);
- pCurve->getEndParam(eParam);
- pCurve->getDistAtParam(eParam,c_length);
- rb=rb->rbnext;
- if (rb==NULL){
- pEnt->close();
- return RTNORM;
- }
- int div=0;
- double offset_dist;
- switch (rb->restype){
- case RTSHORT:
- offset_dist=(double)rb->resval.rint;
- break;
- case RTREAL:
- offset_dist=rb->resval.rreal;
- break;
- default:
- pEnt->close();
- return RTNORM;
- }
- rb=rb->rbnext;
- int type=0;
- AcGePoint3d mid_pt;
- int line_div=0;
- if (rb!=NULL)
- {
- switch (rb->restype){
- case RTSHORT:
- if ((rb->resval.rint>0)&&(rb->resval.rint<=AES_DBASE.Curve_Max_Div)){
- line_div=abs(rb->resval.rint);
- }
- else{
- dist=abs(rb->resval.rint);
- }
- break;
- case RTREAL:
- dist=fabs(rb->resval.rreal);
- break;
- case RT3DPOINT:
- case RTPOINT:
- acdbUcs2Wcs(rb->resval.rpoint,rb->resval.rpoint,Adesk::kFalse);
- mid_pt=asPnt3d(rb->resval.rpoint);
- type=1;
- break;
- default:
- pEnt->close();
- return RTNORM;
- }
- }
- else{
- line_div=0;
- }
- AcDbVoidPtrArray offsetCurves;
- AcDbPolyline *pLwpoly=NULL;
- int lwtype=0;
- if ((pEnt->isKindOf(AcDbLine::desc()))||(pEnt->isKindOf(AcDb2dPolyline::desc()))){
- pCurve=AcDbCurve::cast(pEnt);
- pLwpoly=makePolyFromCurve(pCurve,Adesk::kFalse);
- lwtype=1;
- pCurve=AcDbCurve::cast(pLwpoly);
- }
- if (!(XdDbUtils::isAntiClockWise(pCurve)))
- offset_dist=-offset_dist;
- ret=pCurve->getOffsetCurves(offset_dist,offsetCurves);
- if (pLwpoly)
- delete pLwpoly;
- pEnt->close();
- if (ret!=Acad::eOk){
- return RTNORM;
- }
- int length=offsetCurves.length();
- AcGePoint3d near_pt,ls;
- AcGePoint3dArray nPts,nPts1;
- for (int j=0;j<length;j++){
- nPts1.setLogicalLength(0);
- pOffsetCurve=(AcDbCurve *)offsetCurves.at(j);
- if (type){
- if (j==0){
- pOffsetCurve->getClosestPointTo(mid_pt,ls,Adesk::kTrue);
- }
- else{
- pOffsetCurve->getClosestPointTo(mid_pt,near_pt,Adesk::kTrue);
- if (ls.distanceTo(mid_pt)>near_pt.distanceTo(mid_pt)){
- ls=near_pt;
- }
- }
- }
- else{
- XdDbUtils::getPolyVertxFromCurve(pOffsetCurve,nPts1,dist);
- nPts.append(nPts1);
- }
- delete pOffsetCurve;
- }
- if (type){
- Xd_RetPoint(ls);
- }
- else{
- resbuf *RetList=NULL;
- XdRbUtils::getRbListFromPtArray(&nPts,RetList);
- if (RetList!=NULL){
- XdRbUtils::toLisp(RetList);
- ads_relrb(RetList);
- }
- }
- return RTNORM;
- }
复制代码 |
|