明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3870|回复: 16

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

  [复制链接]
发表于 2007-8-30 16:24:00 | 显示全部楼层 |阅读模式

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

发表于 2007-8-31 09:03:00 | 显示全部楼层

说起来容易,做起来难。。

多边形面积的显示还可以像这样:

objectarx2006\samples\editor\SimpleToolPalette_dg

到于修改面积在点难,怎么修改?只改一个点,还是改几个点?

其实这些功能不用程序也能很好地实现,打开对象特性管理器,选择多段线,对象特性管理器里就有多段线面积,随便移动多段线的夹点位置,其面积也改变了。

 楼主| 发表于 2007-8-31 14:31:00 | 显示全部楼层

多谢你的回复!因为我是初学者,想通过ARX来设计各种功能,这样对我的编程能力的提高有很大的帮助的。

假如只改变所选中的多边形线段的两端点的话,那么当输入的多边形的面积过大或过小时,多边形的边会交叉显示,因而应该改变多点。

 楼主| 发表于 2007-8-31 14:41:00 | 显示全部楼层
用对象特性管理器虽然能改变面积,但是在实际运用中假如我想要得到某一确定的面积,如它是整数值,那么用对象特性管理器很难做到。
发表于 2007-9-12 22:16:00 | 显示全部楼层
按面积比对选择的多边形进行scale缩放
 楼主| 发表于 2007-9-13 10:28:00 | 显示全部楼层

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

发表于 2007-9-13 12:39:00 | 显示全部楼层

AcDbPolyline *pPl;// 所选多边形

AcGePoint3d pt;  点取多边形上的点位置

double dScale=sqrt(新面积/原面积);

pPl->transformBy(AcGeMatrix3d::scaling(dScale,pt);

发表于 2007-9-13 22:30:00 | 显示全部楼层
七楼高手!
发表于 2007-9-13 22:36:00 | 显示全部楼层
过奖
 楼主| 发表于 2007-9-14 09:41:00 | 显示全部楼层

double CalcMPtArea(const AcGePoint3dArray& PtArr)
{
 double dblArea = 0.0;

 int nSize = PtArr.length();

 if (nSize < 3)
 {
  return dblArea;
 }

 AcGePoint3d Pt1, Pt2, Pt3, Pt4;

 t1 = PtArr[0];
 t2 = PtArr[1];
 t3 = PtArr[nSize - 1];
 t4 = PtArr[nSize - 2];

 dblArea = Pt1.y * (Pt3.x - Pt2.x) + Pt3.y * (Pt4.x - Pt1.x);
 
 t3 = Pt1;

 for (int i = 1; i < nSize - 1; i++)
 {
  t1 = PtArr;

  t2 = PtArr[i + 1];

  dblArea += Pt1.y * (Pt3.x - Pt2.x);

  t3 = Pt1;
 }

 return fabs(dblArea / 2);
}

void ChangePLineArea()
{
  AcDbObjectId m_objId;
 AcGePoint3dArray m_PtArr;
 double newArea,oldArea;
 ads_name ssName, ent;
 if (acedSSGet(":S", NULL, NULL, NULL, ssName) != RTNORM )
 {
  return;
 }
 long lNum = 0;
 acedSSLength(ssName, &lNum);
 if (lNum != 1)
 {
  return;
 }
 acedSSName(ssName, 0, ent);
 acedSSFree(ssName);
 acdbGetObjectId(m_objId, ent);
 if (acedGetReal("Input the new area:", &newArea)!= RTNORM )
 {
  return;
 }

 AcDbPolyline * pPolyline = NULL;
 if(acdbOpenObject(pPolyline,m_objId,AcDb::kForRead) != Acad::eOk)
 {
  return;
 }
 unsigned int pnums=pPolyline->numVerts();
 for (unsigned int num = 0 ; num < pnums; num++)
 {
  AcGePoint3d pos;
  Acad :: ErrorStatus es = pPolyline->getPointAt(num,pos);
  if(es != Acad::eOk)
  {
   return;
  }
  m_PtArr.append(pos);
 }
 oldArea = CalcMPtArea(m_PtArr);//计算多边形面积
 acutPrintf("\n已求得面积");

 AcGePoint3d pickPoint;
 ads_point pt;

 if (acedGetPoint(NULL,"\nPick a point :",pt)!=RTNORM)
 {
  return;
 }
 
 pickPoint.x=pt[X];
 pickPoint.y=pt[Y];
 pickPoint.z=pt[Z];

 double dScale=sqrt(newArea/oldArea);
 
 pPolyline->transformBy(AcGeMatrix3d::scaling(dScale,pickPoint));

 pPolyline->close();
}

兄台,为啥运行到 pPolyline->transformBy(AcGeMatrix3d::scaling(dScale,pickPoint));就崩溃了?帮忙指点一下


您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 17:56 , Processed in 0.194217 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表