- UID
- 527501
- 积分
- 151
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2006-12-9
- 最后登录
- 1970-1-1
|
发表于 2018-11-22 14:19:32
|
显示全部楼层
简单演示,十字线碰撞,暂不考虑倾斜线的情况,
示例代码(仅供参考)
![](source/plugin/imc_colorcode/images/loading.gif) - //acedSSGet "f"模式获取交点
- static bool MyGetCrossPoint(ads_point ptCenter,ads_point ptPolar,ads_point &ptEnd)
- {
- bool bflag=false;
- ads_name ss;
- struct resbuf *rbList;
- struct resbuf *rbFilters;
- rbList=acutBuildList(RT3DPOINT,ptCenter,RT3DPOINT,ptPolar,RTNONE);
- rbFilters = acutBuildList(RTDXF0,_T("circle,arc,*Line,ellipse"),RTNONE);
- if (RTNORM == acedSSGet(_T("F"),rbList,NULL,rbFilters,ss))
- {
- struct resbuf *rbOut;
- acedSSNameX(&rbOut,ss,0);
- while(rbOut)
- {
- if (rbOut->restype == RT3DPOINT)
- {
- ptEnd[X] = rbOut->resval.rpoint[X];
- ptEnd[Y] = rbOut->resval.rpoint[Y];
- ptEnd[Z] = rbOut->resval.rpoint[Z];
- bflag=true;
- break;
- }
- rbOut=rbOut->rbnext;
- }
- acutRelRb(rbOut);
- acedSSFree(ss);
- }
- acutRelRb(rbList);
- acutRelRb(rbFilters);
- return bflag;
- }
- static AcDbObjectId PostToModelSpace(AcDbEntity* pEnt)
- {
- AcDbBlockTable *pBlockTable;
- acdbHostApplicationServices()->workingDatabase()
- ->getBlockTable(pBlockTable, AcDb::kForRead);
- AcDbBlockTableRecord *pBlockTableRecord;
- pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
- AcDb::kForWrite);
- AcDbObjectId entId;
- pBlockTableRecord->appendAcDbEntity(entId, pEnt);
- pBlockTable->close();
- pBlockTableRecord->close();
- pEnt->close();
- return entId;
- }
- // - sk_ArxTestCode20181101.mycross command (do not rename)
- static void sk_ArxTestCode20181101mycross(void)
- {
-
- // Add your code for command sk_ArxTestCode20181101.mycross here
- const double myPI = 3.14159265358979323846;
- int nTrack=1,nType;
- AcDbObjectId txtObjId=AcDbObjectId::kNull;
- struct resbuf rbRet;
- while(nTrack>0)
- {
- acedGrRead(nTrack,&nType,&rbRet);
- ads_point ptCenter;
- ptCenter[X]=rbRet.resval.rpoint[X];
- ptCenter[Y]=rbRet.resval.rpoint[Y];
- ptCenter[Z]=rbRet.resval.rpoint[Z];
- //设置十字线的四点,最好按屏幕坐标点计算,这里只是演示
- ads_point ptLeft,ptRight,ptUp,ptDown;
- acutPolar(ptCenter,myPI,10000000.0,ptLeft);
- acutPolar(ptCenter,0.0,10000000.0,ptRight);
- acutPolar(ptCenter,myPI*0.5,10000000.0,ptUp);
- acutPolar(ptCenter,myPI*1.5,10000000.0,ptDown);
- //重画消除Grdraw绘制的线
- acedRedraw(NULL,NULL);
- ads_point ptEnd1,ptEnd2,ptEnd3,ptEnd4;
- bool bIsEnd1=false,bIsEnd2=false,bIsEnd3=false,bIsEnd4=false;
- //调用函数获取十字线与之相交的交点
- if (MyGetCrossPoint(ptCenter,ptLeft,ptEnd1))
- {
- bIsEnd1 = true;
- }
- if (MyGetCrossPoint(ptCenter,ptRight,ptEnd2))
- {
- bIsEnd2 = true;
- }
- if (MyGetCrossPoint(ptCenter,ptUp,ptEnd3))
- {
- bIsEnd3 = true;
- }
- if (MyGetCrossPoint(ptCenter,ptDown,ptEnd4))
- {
- bIsEnd4 = true;
- }
- if (bIsEnd1 && bIsEnd2)
- {
- //虚拟绘制水平线
- acedGrDraw(ptEnd1,ptEnd2,6,-1);
- //以下是创建和修改长度对象的文字,类似的可以添加箭头线
- ads_point ptMid1;
- ptMid1[X]=ptEnd1[X]*0.5+ptEnd2[X]*0.5;
- ptMid1[Y]=ptEnd1[Y]*0.5+ptEnd2[Y]*0.5;
- ptMid1[Z]=ptEnd1[Z]*0.5+ptEnd2[Z]*0.5;
- double dLineLenth=acutDistance(ptEnd1,ptEnd2);
- CString strLenth1;
- strLenth1.Format(_T("lenth=%0.2lf"),dLineLenth);
- if (txtObjId == AcDbObjectId::kNull)
- {
- //首次新建文字
- AcDbText *pNewTxt=new AcDbText(asPnt3d(ptMid1),strLenth1);
- pNewTxt->setHorizontalMode(AcDb::kTextCenter);
- pNewTxt->setAlignmentPoint(asPnt3d(ptMid1));
- txtObjId=PostToModelSpace(pNewTxt);
- }
- else
- {
- //修改文字特性
- AcDbEntity *pEnt=NULL;
- Acad::ErrorStatus es=acdbOpenAcDbEntity(pEnt,txtObjId,AcDb::kForWrite);
- if (Acad::eOk == es)
- {
- AcDbText *pTxt=NULL;
- pTxt=AcDbText::cast(pEnt);
- if (pTxt!=NULL)
- {
- pTxt->setTextString(strLenth1);
- pTxt->setAlignmentPoint(asPnt3d(ptMid1));
- }
- pEnt->close();
- }
- }
- }
- else
- {
- if (txtObjId != AcDbObjectId::kNull)
- {
- //无效区域删除文字,并置空objId
- AcDbEntity *pEnt=NULL;
- Acad::ErrorStatus es=acdbOpenAcDbEntity(pEnt,txtObjId,AcDb::kForWrite);
- if (Acad::eOk == es)
- {
- pEnt->erase();
- pEnt->close();
- }
- txtObjId =AcDbObjectId::kNull;
- }
- }
- if (bIsEnd3 && bIsEnd4)
- {
- //虚拟绘制垂直线
- acedGrDraw(ptEnd3,ptEnd4,6,-1);
- }
- //鼠标左键退出
- if (nType == 3)
- {
- nTrack = 0;
- //退出重画消除Grdraw绘制的线
- acedRedraw(NULL,NULL);
- }
- }
- }
|
评分
-
查看全部评分
|