找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4325|回复: 17

[求助]:怎么计算多边形的形心

[复制链接]
发表于 2002-5-23 05:58:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
面积矩的方法实在不好在计算机上自动实现, 有没有更好的算法?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-5-23 07:07:19 | 显示全部楼层
鱼来了啊:),小鱼儿现在会游泳了吧?

论坛以前讨论过很多次的。

你用ARX写吗?方便的方法,由封闭曲线制作REGION内存模型,然后求REGION的属性就可以了。

LISP也可以用上面方法写,不过过程不太好看:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-5-23 07:14:37 | 显示全部楼层
下面是求封闭AcDbPolyline的型心的VBA方法(利用REGION)


  1. [FONT=courier new]
  2. Sub GetCentroid()

  3. Dim Doc As AcadDocument
  4. Dim Entity As AcadEntity
  5. Dim Region As AcadRegion
  6. Dim Polylist(0 To 0) As AcadEntity
  7. Dim Entities As AcadModelSpace
  8. Dim nPoly As Integer  'number of polylines
  9. Dim i As Integer
  10. Set Doc = ThisDrawing
  11. Set Entities = Doc.ModelSpace
  12. Dim Centroid As Variant



  13. 'Form a region from each polyline
  14. For Each Entity In Entities

  15. If Entity.ObjectName = "AcDbPolyline" Then  'Polyline ?
  16.     Set Polylist(0) = Entity
  17.     Entities.AddRegion Polylist
  18.    MsgBox Entity.ObjectName
  19. End If
  20.   
  21. Next

  22. 'Find centroid of each region
  23. For i = 0 To Entities.Count - 1

  24. If Entities.Item(i).ObjectName = "AcDbRegion" Then  'Region ?
  25.     Set Region = Entities.Item(i)
  26.     Centroid = Region.Centroid
  27.     MsgBox "Centroid X: " & Centroid(0) & vbCrLf & "Centroid Y: " & Centroid(1)
  28. End If
  29.   
  30. Next


  31. End Sub
  32. [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-5-23 07:23:19 | 显示全部楼层
下面是ObjectArx获得AcDb2dPolyline和AcDbPolyline型心的代码:


  1. [FONT=courier new]
  2. void getPolycentroid()
  3. {
  4.        
  5.         ads_name eName;
  6.         ads_point pt;
  7.        
  8.         if (RTNORM != acedEntSel("\n选择一个封闭的polyline:",eName,pt))
  9.         {
  10.                 acutPrintf("\nFailed to select entity");
  11.                 return;
  12.         }
  13.        
  14.        
  15.        
  16.         AcDbObjectId objId = NULL;                 
  17.         Acad::ErrorStatus es;
  18.        
  19.         es = acdbGetObjectId (objId , eName);
  20.         if (Acad::eOk != es)
  21.         {
  22.                 acutPrintf("\nFailed to get object Id");
  23.                 return;
  24.         }
  25.         //如果实体不是REGION,那么转换成REGION
  26.        
  27.         AcDbVoidPtrArray curves;
  28.         AcDbVoidPtrArray regions;
  29.         AcDbEntity *pEnt = NULL;
  30.        
  31.         es =acdbOpenAcDbEntity(pEnt,objId,AcDb::kForRead,Adesk::kFalse);
  32.         if(Acad::eOk != es)
  33.         {
  34.                 acutPrintf("\nFailed to open entity for write");
  35.                 return;
  36.         }
  37.        
  38.         //测试实体是AcDbPolyline还是AcDb2dPolyline)
  39.        
  40.         if (! pEnt->isKindOf(AcDb2dPolyline::desc()) &&
  41. !pEnt->isKindOf(AcDbPolyline::desc()))
  42.         {
  43.                
  44.                 acutPrintf("\nEntity selected is not a polyline");
  45.                 pEnt->close();
  46.                 return;
  47.         }
  48.        
  49.         if (  pEnt->isKindOf(AcDb2dPolyline::desc()) &&
  50. !((AcDb2dPolyline*)pEnt)->isClosed())
  51.         {
  52.                
  53.                 acutPrintf("\nPolyline is not closed");
  54.                 pEnt->close();
  55.                 return;
  56.         }
  57.        
  58.         if (  pEnt->isKindOf(AcDbPolyline::desc()) &&
  59. !((AcDbPolyline*)pEnt)->isClosed())
  60.         {
  61.                
  62.                 acutPrintf("\nPolyline is not closed");
  63.                 pEnt->close();
  64.                 return;
  65.         }
  66.         curves.append(pEnt);         
  67.         pEnt->close();
  68.        
  69.         AcDbRegion* pReg;
  70.         es=AcDbRegion::createFromCurves(curves,regions);
  71.        
  72.         pReg = AcDbRegion::cast((AcRxObject*)regions[0]);
  73.        
  74.    AcGePoint3d origin;
  75.    AcGeVector3d xAxis;
  76.    AcGeVector3d yAxis;
  77.        
  78.         AcGePlane plane;
  79.         pReg->getPlane(plane);
  80.         plane.getCoordSystem(origin, xAxis, yAxis);
  81.        
  82.    double perimeter;
  83.    double area;
  84.    AcGePoint2d centroid;
  85.    double momInertia[2];
  86.    double prodInertia;
  87.    double prinMoments[2];
  88.    AcGeVector2d prinAxes[2];
  89.    double radiiGyration[2];
  90.    AcGePoint2d extentsLow;
  91.    AcGePoint2d extentsHigh;
  92.         pReg->getAreaProp(origin,
  93.                 xAxis,
  94.                 yAxis,
  95.                 perimeter,
  96.                 area,
  97.                 centroid,
  98.                 momInertia,
  99.                 prodInertia,
  100.                 prinMoments,
  101.                 prinAxes,
  102.                 radiiGyration,
  103.                 extentsLow,
  104.                 extentsHigh) ;
  105.        
  106.         AcGeVector3d normal;
  107.         pReg->getNormal(normal);
  108.         pReg->close();
  109.         AcGeMatrix3d mat;
  110.        
  111.         mat.setCoordSystem(origin,xAxis,yAxis,normal);
  112.    
  113.         //put point at centriod
  114.         AcGePoint3d cpt(centroid[0],centroid[1],0.0);
  115.        
  116.         cpt.transformBy(mat);
  117.         resbuf pdm,pds;
  118.         pdm.restype = RTSHORT;
  119.         pdm.resval.rint = 34;
  120.         acedSetVar("PDMODE",&pdm);
  121.         pds.restype = RTSHORT;
  122.         pds.resval.rint = -5;
  123.         acedSetVar("PDSIZE",&pds);
  124.         acedCommand(RTSTR,"POINT",RT3DPOINT,asDblArray(cpt),0);
  125.         acutPrintf("Centroid=%f,%f",cpt[0],cpt[1]);
  126.        
  127. }
  128. [/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-5-23 21:10:35 | 显示全部楼层
小鱼儿快2岁了, 现在非常淘气也特别好玩, 下次来北京别忘了给他红包呀:)
"论坛以前讨论过很多次的", 是不是在老论坛里面, 我怎么找不到? 贴一下URL.
另外, 有没有不用REGION的方法, 我正在试图用行列式的方法进行推导, 不过现在数学都还给老师了, 得先补补课.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-6-17 20:33:06 | 显示全部楼层
XD,你的回复我实在看不懂,这是不是C语言的编程啊?能不能把成品贴上来让我分享一下啊?谢了,因为我用的方法实在太菜了。到现在我还在画对角线来找多边形的形心呢。:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-6-17 21:45:57 | 显示全部楼层
最初由 philroo 发布
[B]XD,你的回复我实在看不懂,这是不是C语言的编程啊?能不能把成品贴上来让我分享一下啊?谢了,因为我用的方法实在太菜了。到现在我还在画对角线来找多边形的形心呢。:) [/B]


上面三个代码一个是VBA的,一个是ARX的,一个是LISP的。

不知道你是否会用LISP,把上面那个LISP代码拷贝到文件中,把文件存成扩展名为LSP的文件,在ACAD调入这个LISP文件,然后用那个函数就可以了,函数的参数是顶点表。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-6-18 15:18:06 | 显示全部楼层
XD,我还没接触过LISP,但是看到论坛里面大家都对它这么熟悉,我还非常感兴趣,如果文件不是很大的话告诉我哪里能下载好吗?谢谢了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-7-31 17:29:18 | 显示全部楼层
不好意思,函数怎能么调用啊?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-8-1 10:18:32 | 显示全部楼层
我怎么看不到lsp的版本阿?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-8-2 01:02:40 | 显示全部楼层
我自己用lisp编写了一个求任意形状图形的形心的程序。它包括求多个任意形状的图形的组合形心,并且会自己会画出形心的位置。
但只能用于2000以上版本。由于是个人用,编写得比较简单。需要加载lisp程序。启动命令为GLA
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-8-7 09:06:33 | 显示全部楼层
你的好像只能求规则面积的形心,不规则的没有办法
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-8-8 11:01:29 | 显示全部楼层
老大,有没有不画图、不选pl实体就根据给定的一组坐标求算出形心的VBA子程序啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-6-15 21:25:30 | 显示全部楼层
最初由 XDSoft 发布
[B][QUOTE]最初由 philroo 发布
[B]XD,你的回复我实在看不懂,这是不是C语言的编程啊?能不能把成品贴上来让我分享一下啊?谢了,因为我用的方法实在太菜了。到现在我还在画对角线来找多边形的形心呢。:) [/... [/B]



lisp代码在哪里?怎么没有啊?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2007-6-16 13:03:17 | 显示全部楼层
如果求形新的话
用(vla-get-Centroid obj) 就可以了         
这是我以前发的一个求形心,惯性矩等截面几何参数的lisp程序。
如果拷贝代码不对的话可以参考
http://www.mjtd.com/Functions/ArticleShow.asp?ArticleID=1173

  1. (alert "\n本程序命令为TEST,具体用法如下:
  2.         \n单位和精度由ACAD确定,可自己控制,选择封闭线段物体,或者region物体,          
  3.         \n在提示数据输出方式时,按下P或W键,P代表屏幕输出,W则在C:盘创建数据。
  4.         \n请尊重原创者,勿用于商业目的!!    Highflybird   2007.1.23  KunMing")
  5. (defun mas (obj / Area Area1 Area2 Perimeter Centroid Centroid1 Centroid2 MomentOfInertia
  6.                   MomentOfInertia1 PrincipalDirections PrincipalMoments minpt maxpt Sx Sy
  7.                   ProductOfInertia ProductOfInertia1 RadiiOfGyration Wx1 Wx2 Wy1 Wy2 obj1
  8.                   obj2 recPt1 recPt2 reg1 reg2 CenX CenY)
  9.   (if (= "AcDbRegion" (vla-get-objectname obj))                        ;如果是截面则计算
  10.     (progn
  11.       (setq Area (vla-get-area obj)                                    ;面积
  12.             Perimeter (vla-get-Perimeter obj)                          ;周长
  13.             Centroid (V2L (vla-get-Centroid obj))                      ;质心
  14.             MomentOfInertia (V2L (vla-get-MomentOfInertia obj))        ;惯性矩
  15.             PrincipalDirections (V2L (vla-get-PrincipalDirections obj));主矩方向
  16.             PrincipalMoments (V2L (vla-get-PrincipalMoments obj))      ;主力矩与质心的X-Y方向
  17.             ProductOfInertia (vla-get-ProductOfInertia obj)            ;惯性积
  18.       )                                                                ;setq
  19.       (vla-move obj (vlax-3d-point Centroid) (vlax-3d-point '(0 0)))   ;移动质心到原点
  20.       (setq MomentOfInertia1 (V2L (vla-get-MomentOfInertia obj))       ;质心的惯性矩
  21.             ProductOfInertia1 (vla-get-ProductOfInertia obj)           ;质心的惯性积
  22.             RadiiOfGyration (V2L (vla-get-RadiiOfGyration obj))        ;回旋半径
  23.       )                                                                ;setq
  24.       (vla-getboundingbox obj 'minpt 'maxpt)                           ;边界框
  25.       (setq minpt (vlax-safearray->list minpt)                         ;左下角点
  26.             maxpt (vlax-safearray->list maxpt)                         ;右上角点
  27.             Wx1 (/ (car MomentOfInertia1) (cadr minpt))                ;抵抗矩
  28.             Wx2 (/ (car MomentOfInertia1) (cadr maxpt))
  29.             Wy1 (/ (cadr MomentOfInertia1) (car minpt))
  30.             Wy2 (/ (cadr MomentOfInertia1) (car maxpt))                                                  
  31.       )                                                                ;setq
  32.       (vla-move obj (vlax-3d-point '(0 0)) (vlax-3d-point Centroid))   ;移回原来位置
  33.       (setq obj1 (vla-copy obj)                                        ;拷贝物体以用来算X面积矩
  34.             obj2 (vla-copy obj)                                        ;拷贝物体以用来算Y面积矩
  35.             CenX (car Centroid)
  36.             CenY (cadr Centroid)
  37.             recPt1 (list (+ CenX (car minpt) -1) CenY                  ;建立两个矩形面域的点表
  38.                          (+ CenX (car maxpt) +1) CenY            
  39.                          (+ CenX (car maxpt) +1) (+ CenY (cadr minpt) -1)         
  40.                          (+ CenX (car minpt) -1) (+ CenY (cadr minpt) -1))                               
  41.             recPt2 (list (+ CenX (car minpt) -1) (+ CenY (cadr minpt) -1)               
  42.                          (+ CenX (car minpt) -1) (+ CenY (cadr maxpt) +1)        
  43.                          CenX (+ CenY (cadr maxpt) +1)
  44.                          CenX (+ CenY (cadr minpt) -1))
  45.             reg1 (draw-rectange recPt1)                                ;创建面域1
  46.             reg2 (draw-rectange recPt2)                                ;创建面域2
  47.       )
  48.       (vla-boolean obj1 acSubtraction reg1)                            ;求obj1与面域1之差
  49.       (vla-boolean obj2 acSubtraction reg2)                            ;求obj2与面域2之差
  50.       (setq Area1 (vla-get-area obj1)                                  ;求obj1的面积
  51.             Area2 (vla-get-area obj2)                                  ;求obj2的面积
  52.             Centroid1 (V2L (vla-get-Centroid obj1))                    ;求obj1的质心
  53.             Centroid2 (V2L (vla-get-Centroid obj2))                    ;求obj2的质心
  54.             Sx (* Area1 (- (cadr Centroid1) (cadr Centroid)))          ;绕X轴面积矩(静矩)
  55.             Sy (* Area2 (- (car  Centroid2) (car  Centroid)))          ;绕Y轴面积矩(静矩)
  56.       )
  57.       (vla-delete obj1)                                                ;删除面域1
  58.       (vla-delete obj2)                                                ;删除面域2
  59.       (list (cons "面积        " Area)                                 ;返回各种参数值
  60.             (cons "周长        " Perimeter)
  61.             (cons "质心        " Centroid)
  62.             (cons "X 轴主惯性矩" (car PrincipalMoments))
  63.             (cons "X 轴惯性矩  " (car MomentOfInertia1))
  64.             (cons "Y 轴主惯性矩" (cadr PrincipalMoments))
  65.             (cons "Y 轴惯性矩  " (cadr MomentOfInertia1))
  66.             (cons "XY惯性积    " ProductOfInertia1)
  67.             (cons "X 轴上抗弯距" Wx2)
  68.             (cons "X 轴下抗弯距" Wx1)
  69.             (cons "Y 轴左抗弯距" Wy1)
  70.             (cons "Y 轴右抗弯距" Wy2)
  71.             (cons "X 轴面积矩  " Sx )
  72.             (cons "Y 轴面积矩  " Sy )
  73.             (cons "回旋半径ix  " (car RadiiOfGyration))
  74.             (cons "回旋半径iy  " (cadr RadiiOfGyration))
  75.             (cons "主矩方向1   " (list (car PrincipalDirections) (caddr PrincipalDirections)))
  76.             (cons "主矩方向2   " (list (cadr PrincipalDirections) (cadddr PrincipalDirections)))
  77.             (cons "距左边距离  " (abs (car minpt)))
  78.             (cons "距右边距离  " (abs (car maxpt)))
  79.             (cons "距上边距离  " (abs (cadr maxpt)))
  80.             (cons "距下边距离  " (abs (cadr minpt)))
  81.       )
  82.     )
  83.   )
  84. )
  85. ;;;用ActiveX的方式画矩形面域
  86. (defun draw-rectange (recpts / pts rec reg)
  87.   (setq pts (vlax-make-safearray vlax-vbdouble '(0 . 7)))
  88.   (vlax-safearray-fill pts recpts)
  89.   (setq rec (vla-addlightweightPolyline *MSP pts));创建矩形
  90.   (vla-put-closed rec 1)                          ;封闭矩形
  91.   (setq reg (vla-addregion *MSP (O2L rec)))       ;对矩形求面域
  92.   (vla-delete rec)                                  ;删除矩形的轻多段线
  93.   (car (V2L reg))                                 ;取得矩形面域物体
  94. )
  95. ;;;ActiveX的变量转化为lisp列表
  96. (defun V2L (x)
  97.   (vlax-safearray->list (vlax-variant-value x))
  98. )
  99. ;;;把选择集的物体转化为安全数组
  100. (defun S2A (ss / i l objs curves)
  101.   (setq i -1 l (sslength ss) objs nil)
  102.   (repeat l
  103.     (setq objs (cons (vlax-ename->vla-object (ssname ss (setq i (1+ i)))) objs))
  104.   )
  105.   (setq curves (vlax-make-safearray vlax-vbobject (eval '(cons 0 (1- l)))))
  106.   (vlax-safearray-fill curves objs)
  107. )
  108. ;;;把选择集的物体转化为Lisp表
  109. (defun S2L (ss / i l objs)
  110.   (setq i -1 l (sslength ss) objs nil)
  111.   (repeat l
  112.     (setq objs (cons (vlax-ename->vla-object (ssname ss (setq i (1+ i)))) objs))
  113.   )
  114. )
  115. ;;;物体组成lisp列表
  116. (defun O2L (obj / curves)
  117.   (setq curves (vlax-make-safearray vlax-vbobject '(0 . 0)))
  118.   (vlax-safearray-fill curves (list obj))
  119. )
  120. ;;;打印截面表并计数
  121. (defun GetNum (regobjs Num / Number reglst)
  122.   (setq Number Num)                               ;计数归零
  123.   (foreach obj regobjs                                  
  124.     (setq reglst (mas obj))                       ;对其分别求值
  125.     (princ obj)                                          ;打印region名
  126.     (princ "\n下面为该物体的参数的列表: ")
  127.     (foreach n reglst (princ "\n") (princ n))     ;打印region参数表
  128.     (setq Number (1+ Number))                     ;计数累加
  129.   )
  130. )
  131. ;;;表转化成字符串
  132. (defun L2S (lst / s)
  133.   (setq        s
  134.          (apply
  135.            'strcat
  136.            (mapcar '(lambda(x)(strcat (rtos x) " ")) lst)
  137.          )
  138.   )
  139.   (setq s (substr s 1 (1- (strlen s))))
  140.   (strcat "(" s ")")
  141. )
  142. ;;;写数据函数
  143. (defun WrData (regobjs Num / Number reglst string str1 str2 str)
  144.   (setq Number Num)                               ;计数归零
  145.   (foreach obj regobjs                                  
  146.     (setq reglst (mas obj))                       ;对其分别求值
  147.     (setq Number (1+ Number))                     ;计数累加
  148.     (write-line "***********************************" file)
  149.     (setq string (strcat "截面" (itoa Number) "的参数表:"))
  150.     (write-line string file)                      ;写入region名
  151.     (foreach n reglst
  152.       (setq str1 (car n))                         ;参数名称
  153.       (if (listp (setq str2 (cdr n)))             ;参数值
  154.         (setq str2 (L2S str2))         
  155.         (setq str2 (rtos str2))
  156.       )
  157.       (setq str (strcat str1 ": " str2))
  158.       (write-line str file)                       ;写入region参数表
  159.     )                                             
  160.   )
  161.   Number
  162. )
  163. ;;;以下测试程序
  164. (defun C:test (/ *APP *DOC *MSP i j ss ss1 err objlst REGs W&P OLDCMD OldUcs file)
  165.   (vl-load-com)
  166.   (setq        *APP (vlax-get-acad-object)
  167.         *DOC (vla-get-activeDocument *APP)
  168.         *MSP (vla-get-Modelspace *DOC)
  169.   )
  170.   (princ)
  171.   (if (setq ss (ssget))                           ;建立选择集
  172.     (progn
  173.       (initget 1 "W P")                           ;选择写入文件或屏幕打印
  174.       (setq W&P (getkword "\n确定输出数据方式:\n写入文件[W]或屏幕打印[P])?"))
  175.       (princ "\n")   
  176.       (setq OLDCMD (getvar "CMDECHO"))
  177.       (setvar "CMDECHO" 0)
  178.       ;;(command ".UCS" "W")
  179.       (uu 1)
  180.       (setq objlst (S2A ss))                      ;选择集列表
  181.       (if (setq ss1 (ssget "P" '((0 . "REGION"))));选择集中已有的region
  182.         (setq i (if (= W&P "P")                   ;计算并求出region数目
  183.                   (GetNum (S2L ss1) 0)
  184.                   (progn
  185.                     (setq file (open "C:\\截面几何参数.TXT""W"));打开文件
  186.                     (Wrdata (S2L ss1) 0)
  187.                   )
  188.                 )
  189.         )
  190.         (setq i 0)
  191.       )                           
  192.       (defun addreg ()
  193.         (setq REGs (vla-addregion *MSP objlst))
  194.       )
  195.       (setq err (vl-catch-all-apply 'addreg))     ;建立区域并出错检测
  196.       (if (vl-catch-all-error-p err)              ;如果没有新建任何region
  197.         (setq j 0)                                ;则计数为0
  198.         (setq REGs (V2L REGs)                     ;否则转化成region集合
  199.               i (if (= W&P "P")                   ;计算并求出region数目
  200.                   (GetNum REGs i)
  201.                   (progn
  202.                     (setq file (open "C:\\截面几何参数.TXT""A"));打开文件
  203.                     (Wrdata REGs i)
  204.                   )
  205.                 )
  206.               j (mapcar 'vla-delete REGs)         ;删除刚建立的截面
  207.         )
  208.       )
  209.       (close file)                                ;关闭文件
  210.       (if (/= 0 i)
  211.         (progn
  212.           (princ "\n\n已经列出")
  213.           (princ i)
  214.           (princ "个截面几何参数表.")
  215.         )
  216.         (alert "没有选中有效的截面!")
  217.       )
  218.       ;;(command ".UCS" "P")
  219.       (uu 0)
  220.       (setvar "CMDECHO" OLDCMD)
  221.     )
  222.     (alert "你没有选中物体! ")
  223.   )
  224.   (gc)
  225.   (princ)
  226. )
  227. (defun uu (T&F / WCSOrg WCSXDr WCSYDr WCSObj OldOrg OldXDr OldYDr *UTI *UCS)
  228.   (setq *UTI (vla-get-Utility *DOC)                             ;取得Utility集
  229.         *UCS (vla-get-UserCoordinateSystems *DOC)               ;取得UCS集
  230.   )
  231.   (setq WCSOrg (vlax-3d-point '(0 0 0)))                        ;WCS原点
  232.   (setq WCSXDr (vlax-3d-point '(1 0 0)))
  233.   (setq WCSYDr (vlax-3d-point '(0 1 0)))
  234.   (setq WCSObj (vla-add *UCS WCSOrg  WCSXDr WCSYDr "WCS"))
  235.   (if (= T&F 1)
  236.     (progn
  237.       (if (= (getvar "UCSNAME") "")                             ;当前UCS名,如果未命名,则
  238.         (progn
  239.           (setq OldOrg (vla-GetVariable *DOC "UCSORG")          ;取当前UCS原点
  240.                   OldXDr (vla-getVariable *DOC "UCSXDIR")         ;取当前X方向
  241.                 OldYDr (vla-getVariable *DOC "UCSYDIR")         ;取当前Y方向
  242.                 OldUcs (vla-add *UCS WCSOrg OldXDr OldYDr "OLD");建立当前UCS,但原点在'(0,0,0)处
  243.           )
  244.           (vla-put-origin OldUcs OldOrg)                        ;改变原点为当前UCS原点
  245.         )
  246.         (setq OldUcs (vla-get-ActiveUcs *DOC))                  ;如果已经命名,则取得UCS物体
  247.       )
  248.       (vla-put-ActiveUcs *DOC WCSobj)
  249.     )
  250.     (vla-put-ActiveUcs *DOC OldUcs)   
  251.   )
  252.   OldUcs
  253. )

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-27 00:00 , Processed in 0.208531 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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