wangyj 发表于 2007-8-30 16:24:00

[求助]选取多边形上的一点来改变多边形的面积

<p>&nbsp;&nbsp;&nbsp; 运用vs.net2002进行cad二次开发(ARX),用选择集(acedSSGet)选取已创建的多边形上的任意一点,在命令行显示多边形的面积,然后在命令行显示提示语句要求输入新的多边形的面积。这样在原有的多边形的基础上创建了一个新的多边形,最后把原有的多边形用新创建的多边形替换。听起来是不是有点复杂,不过对大家来说一定不成问题。拜托,哪位兄台能帮帮忙啦!</p>

zhang007 发表于 2007-8-31 09:03:00

<p>说起来容易,做起来难。。</p><p>多边形面积的显示还可以像这样:</p><p>objectarx2006\samples\editor\SimpleToolPalette_dg</p><p>到于修改面积在点难,怎么修改?只改一个点,还是改几个点?</p><p>其实这些功能不用程序也能很好地实现,打开对象特性管理器,选择多段线,对象特性管理器里就有多段线面积,随便移动多段线的夹点位置,其面积也改变了。</p>

wangyj 发表于 2007-8-31 14:31:00

<p>多谢你的回复!因为我是初学者,想通过ARX来设计各种功能,这样对我的编程能力的提高有很大的帮助的。</p><p>假如只改变所选中的多边形线段的两端点的话,那么当输入的多边形的面积过大或过小时,多边形的边会交叉显示,因而应该改变多点。</p>

wangyj 发表于 2007-8-31 14:41:00

用对象特性管理器虽然能改变面积,但是在实际运用中假如我想要得到某一确定的面积,如它是整数值,那么用对象特性管理器很难做到。

fpiw 发表于 2007-9-12 22:16:00

按面积比对选择的多边形进行scale缩放

wangyj 发表于 2007-9-13 10:28:00

<p>还是不大理解,有没有相关代码?多谢啦!</p>

fpiw 发表于 2007-9-13 12:39:00

<p>AcDbPolyline *pPl;// 所选多边形</p><p>AcGePoint3d pt;&nbsp; 点取多边形上的点位置</p><p>double dScale=sqrt(新面积/原面积);</p><p>pPl-&gt;transformBy(AcGeMatrix3d::scaling(dScale,pt);</p>

sieben 发表于 2007-9-13 22:30:00

七楼高手!

fpiw 发表于 2007-9-13 22:36:00

过奖

wangyj 发表于 2007-9-14 09:41:00

<p>double CalcMPtArea(const AcGePoint3dArray&amp; PtArr)<br/>{<br/>&nbsp;double dblArea = 0.0;</p><p>&nbsp;int nSize = PtArr.length();</p><p>&nbsp;if (nSize &lt; 3)<br/>&nbsp;{<br/>&nbsp;&nbsp;return dblArea;<br/>&nbsp;}</p><p>&nbsp;AcGePoint3d Pt1, Pt2, Pt3, Pt4;</p><p>&nbsp;Pt1 = PtArr;<br/>&nbsp;Pt2 = PtArr;<br/>&nbsp;Pt3 = PtArr;<br/>&nbsp;Pt4 = PtArr;</p><p>&nbsp;dblArea = Pt1.y * (Pt3.x - Pt2.x) + Pt3.y * (Pt4.x - Pt1.x);<br/>&nbsp;<br/>&nbsp;Pt3 = Pt1;</p><p>&nbsp;for (int i = 1; i &lt; nSize - 1; i++)<br/>&nbsp;{<br/>&nbsp;&nbsp;Pt1 = PtArr;</p><p>&nbsp;&nbsp;Pt2 = PtArr;</p><p>&nbsp;&nbsp;dblArea += Pt1.y * (Pt3.x - Pt2.x);</p><p>&nbsp;&nbsp;Pt3 = Pt1;<br/>&nbsp;}</p><p>&nbsp;return fabs(dblArea / 2);<br/>}</p><p>void ChangePLineArea()<br/>{<br/>&nbsp;&nbsp;AcDbObjectId m_objId;<br/>&nbsp;AcGePoint3dArray m_PtArr;<br/>&nbsp;double newArea,oldArea;<br/>&nbsp;ads_name ssName, ent;<br/>&nbsp;if (acedSSGet(":S", NULL, NULL, NULL, ssName) != RTNORM )<br/>&nbsp;{<br/>&nbsp;&nbsp;return;<br/>&nbsp;}<br/>&nbsp;long lNum = 0;<br/>&nbsp;acedSSLength(ssName, &amp;lNum);<br/>&nbsp;if (lNum != 1)<br/>&nbsp;{<br/>&nbsp;&nbsp;return;<br/>&nbsp;}<br/>&nbsp;acedSSName(ssName, 0, ent);<br/>&nbsp;acedSSFree(ssName);<br/>&nbsp;acdbGetObjectId(m_objId, ent);<br/>&nbsp;if (acedGetReal("Input the new area:", &amp;newArea)!= RTNORM )<br/>&nbsp;{<br/>&nbsp;&nbsp;return;<br/>&nbsp;}</p><p>&nbsp;AcDbPolyline * pPolyline = NULL;<br/>&nbsp;if(acdbOpenObject(pPolyline,m_objId,AcDb::kForRead) != Acad::eOk)<br/>&nbsp;{<br/>&nbsp;&nbsp;return;<br/>&nbsp;}<br/>&nbsp;unsigned int pnums=pPolyline-&gt;numVerts();<br/>&nbsp;for (unsigned int num = 0 ; num &lt; pnums; num++)<br/>&nbsp;{<br/>&nbsp;&nbsp;AcGePoint3d pos;<br/>&nbsp;&nbsp;Acad :: ErrorStatus es = pPolyline-&gt;getPointAt(num,pos);<br/>&nbsp;&nbsp;if(es != Acad::eOk)<br/>&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;return;<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp;m_PtArr.append(pos);<br/>&nbsp;}<br/>&nbsp;oldArea = CalcMPtArea(m_PtArr);//计算多边形面积<br/>&nbsp;acutPrintf("\n已求得面积");</p><p>&nbsp;AcGePoint3d pickPoint;<br/>&nbsp;ads_point pt;</p><p>&nbsp;if (acedGetPoint(NULL,"\nPick a point :",pt)!=RTNORM)<br/>&nbsp;{<br/>&nbsp;&nbsp;return;<br/>&nbsp;}<br/>&nbsp;<br/>&nbsp;pickPoint.x=pt;<br/>&nbsp;pickPoint.y=pt;<br/>&nbsp;pickPoint.z=pt;</p><p>&nbsp;double dScale=sqrt(newArea/oldArea);<br/>&nbsp;<br/>&nbsp;pPolyline-&gt;transformBy(AcGeMatrix3d::scaling(dScale,pickPoint));</p><p>&nbsp;pPolyline-&gt;close();<br/>}</p><p>兄台,为啥运行到&nbsp;pPolyline-&gt;transformBy(AcGeMatrix3d::scaling(dScale,pickPoint));就崩溃了?帮忙指点一下</p><p><br/></p>
页: [1] 2
查看完整版本: [求助]选取多边形上的一点来改变多边形的面积