[求助]选取多边形上的一点来改变多边形的面积
<p> 运用vs.net2002进行cad二次开发(ARX),用选择集(acedSSGet)选取已创建的多边形上的任意一点,在命令行显示多边形的面积,然后在命令行显示提示语句要求输入新的多边形的面积。这样在原有的多边形的基础上创建了一个新的多边形,最后把原有的多边形用新创建的多边形替换。听起来是不是有点复杂,不过对大家来说一定不成问题。拜托,哪位兄台能帮帮忙啦!</p> <p>说起来容易,做起来难。。</p><p>多边形面积的显示还可以像这样:</p><p>objectarx2006\samples\editor\SimpleToolPalette_dg</p><p>到于修改面积在点难,怎么修改?只改一个点,还是改几个点?</p><p>其实这些功能不用程序也能很好地实现,打开对象特性管理器,选择多段线,对象特性管理器里就有多段线面积,随便移动多段线的夹点位置,其面积也改变了。</p> <p>多谢你的回复!因为我是初学者,想通过ARX来设计各种功能,这样对我的编程能力的提高有很大的帮助的。</p><p>假如只改变所选中的多边形线段的两端点的话,那么当输入的多边形的面积过大或过小时,多边形的边会交叉显示,因而应该改变多点。</p> 用对象特性管理器虽然能改变面积,但是在实际运用中假如我想要得到某一确定的面积,如它是整数值,那么用对象特性管理器很难做到。 按面积比对选择的多边形进行scale缩放 <p>还是不大理解,有没有相关代码?多谢啦!</p> <p>AcDbPolyline *pPl;// 所选多边形</p><p>AcGePoint3d pt; 点取多边形上的点位置</p><p>double dScale=sqrt(新面积/原面积);</p><p>pPl->transformBy(AcGeMatrix3d::scaling(dScale,pt);</p> 七楼高手! 过奖 <p>double CalcMPtArea(const AcGePoint3dArray& PtArr)<br/>{<br/> double dblArea = 0.0;</p><p> int nSize = PtArr.length();</p><p> if (nSize < 3)<br/> {<br/> return dblArea;<br/> }</p><p> AcGePoint3d Pt1, Pt2, Pt3, Pt4;</p><p> Pt1 = PtArr;<br/> Pt2 = PtArr;<br/> Pt3 = PtArr;<br/> Pt4 = PtArr;</p><p> dblArea = Pt1.y * (Pt3.x - Pt2.x) + Pt3.y * (Pt4.x - Pt1.x);<br/> <br/> Pt3 = Pt1;</p><p> for (int i = 1; i < nSize - 1; i++)<br/> {<br/> Pt1 = PtArr;</p><p> Pt2 = PtArr;</p><p> dblArea += Pt1.y * (Pt3.x - Pt2.x);</p><p> Pt3 = Pt1;<br/> }</p><p> return fabs(dblArea / 2);<br/>}</p><p>void ChangePLineArea()<br/>{<br/> AcDbObjectId m_objId;<br/> AcGePoint3dArray m_PtArr;<br/> double newArea,oldArea;<br/> ads_name ssName, ent;<br/> if (acedSSGet(":S", NULL, NULL, NULL, ssName) != RTNORM )<br/> {<br/> return;<br/> }<br/> long lNum = 0;<br/> acedSSLength(ssName, &lNum);<br/> if (lNum != 1)<br/> {<br/> return;<br/> }<br/> acedSSName(ssName, 0, ent);<br/> acedSSFree(ssName);<br/> acdbGetObjectId(m_objId, ent);<br/> if (acedGetReal("Input the new area:", &newArea)!= RTNORM )<br/> {<br/> return;<br/> }</p><p> AcDbPolyline * pPolyline = NULL;<br/> if(acdbOpenObject(pPolyline,m_objId,AcDb::kForRead) != Acad::eOk)<br/> {<br/> return;<br/> }<br/> unsigned int pnums=pPolyline->numVerts();<br/> for (unsigned int num = 0 ; num < pnums; num++)<br/> {<br/> AcGePoint3d pos;<br/> Acad :: ErrorStatus es = pPolyline->getPointAt(num,pos);<br/> if(es != Acad::eOk)<br/> {<br/> return;<br/> }<br/> m_PtArr.append(pos);<br/> }<br/> oldArea = CalcMPtArea(m_PtArr);//计算多边形面积<br/> acutPrintf("\n已求得面积");</p><p> AcGePoint3d pickPoint;<br/> ads_point pt;</p><p> if (acedGetPoint(NULL,"\nPick a point :",pt)!=RTNORM)<br/> {<br/> return;<br/> }<br/> <br/> pickPoint.x=pt;<br/> pickPoint.y=pt;<br/> pickPoint.z=pt;</p><p> double dScale=sqrt(newArea/oldArea);<br/> <br/> pPolyline->transformBy(AcGeMatrix3d::scaling(dScale,pickPoint));</p><p> pPolyline->close();<br/>}</p><p>兄台,为啥运行到 pPolyline->transformBy(AcGeMatrix3d::scaling(dScale,pickPoint));就崩溃了?帮忙指点一下</p><p><br/></p>
页:
[1]
2