找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5587|回复: 10

[飞鸟集] 求惯性矩、面积矩、抵抗矩等截面几何参数的小程序

[复制链接]

已领礼包: 8121个

财富等级: 富甲天下

发表于 2007-1-23 16:18:16 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 Highflybird 于 2013-6-14 17:33 编辑

一个求惯性矩、面积矩、抵抗矩等截面几何参数的小程序。
能选择多个封闭物体和多个截面(region),然后输出数据,数据中包括了截面的几何参数。
命令合二为一为: test,单位和精度由ACAD确定,可自己控制,选择封闭线段物体,或者region物体,在提示数据输出方式时,按下P或W键,P代表屏幕输出,W则在C:盘创建数据(可用记事本打开)。
[pcode=lisp,true]
(defun mas (obj / Area Area1 Area2 Perimeter Centroid Centroid1 Centroid2 MomentOfInertia
                  MomentOfInertia1 PrincipalDirections PrincipalMoments minpt maxpt Sx Sy
                  ProductOfInertia ProductOfInertia1 RadiiOfGyration Wx1 Wx2 Wy1 Wy2 obj1
                  obj2 recPt1 recPt2 reg1 reg2 CenX CenY)
  (if (= "AcDbRegion" (vla-get-objectname obj))                        ;如果是截面则计算
    (progn
      (setq Area (vla-get-area obj)                                    ;面积
            Perimeter (vla-get-Perimeter obj)                          ;周长
            Centroid (V2L (vla-get-Centroid obj))                      ;质心
            MomentOfInertia (V2L (vla-get-MomentOfInertia obj))        ;惯性矩
            PrincipalDirections (V2L (vla-get-PrincipalDirections obj));主矩方向
            PrincipalMoments (V2L (vla-get-PrincipalMoments obj))      ;主力矩与质心的X-Y方向
            ProductOfInertia (vla-get-ProductOfInertia obj)            ;惯性积
      )                                                                ;setq
      (vla-move obj (vlax-3d-point Centroid) (vlax-3d-point '(0 0)))   ;移动质心到原点
      (setq MomentOfInertia1 (V2L (vla-get-MomentOfInertia obj))       ;质心的惯性矩
            ProductOfInertia1 (vla-get-ProductOfInertia obj)           ;质心的惯性积
            RadiiOfGyration (V2L (vla-get-RadiiOfGyration obj))        ;回旋半径
      )                                                                ;setq
      (vla-getboundingbox obj 'minpt 'maxpt)                           ;边界框
      (setq minpt (vlax-safearray->list minpt)                         ;左下角点
            maxpt (vlax-safearray->list maxpt)                         ;右上角点
            Wx1 (/ (car MomentOfInertia1) (cadr minpt))                ;抵抗矩
            Wx2 (/ (car MomentOfInertia1) (cadr maxpt))
            Wy1 (/ (cadr MomentOfInertia1) (car minpt))
            Wy2 (/ (cadr MomentOfInertia1) (car maxpt))                                                  
      )                                                                ;setq
      (vla-move obj (vlax-3d-point '(0 0)) (vlax-3d-point Centroid))   ;移回原来位置
      (setq obj1 (vla-copy obj)                                        ;拷贝物体以用来算X面积矩
            obj2 (vla-copy obj)                                        ;拷贝物体以用来算Y面积矩
            CenX (car Centroid)
            CenY (cadr Centroid)
            recPt1 (list (+ CenX (car minpt) -1) CenY                  ;建立两个矩形面域的点表
                         (+ CenX (car maxpt) +1) CenY            
                         (+ CenX (car maxpt) +1) (+ CenY (cadr minpt) -1)         
                         (+ CenX (car minpt) -1) (+ CenY (cadr minpt) -1))                              
            recPt2 (list (+ CenX (car minpt) -1) (+ CenY (cadr minpt) -1)               
                         (+ CenX (car minpt) -1) (+ CenY (cadr maxpt) +1)        
                         CenX (+ CenY (cadr maxpt) +1)
                         CenX (+ CenY (cadr minpt) -1))
            reg1 (draw-rectange recPt1)                                ;创建面域1
            reg2 (draw-rectange recPt2)                                ;创建面域2
      )
      (vla-boolean obj1 acSubtraction reg1)                            ;求obj1与面域1之差
      (vla-boolean obj2 acSubtraction reg2)                            ;求obj2与面域2之差
      (setq Area1 (vla-get-area obj1)                                  ;求obj1的面积
            Area2 (vla-get-area obj2)                                  ;求obj2的面积
            Centroid1 (V2L (vla-get-Centroid obj1))                    ;求obj1的质心
            Centroid2 (V2L (vla-get-Centroid obj2))                    ;求obj2的质心
            Sx (* Area1 (- (cadr Centroid1) (cadr Centroid)))          ;绕X轴面积矩(静矩)
            Sy (* Area2 (- (car  Centroid2) (car  Centroid)))          ;绕Y轴面积矩(静矩)
      )
      (vla-delete obj1)                                                ;删除面域1
      (vla-delete obj2)                                                ;删除面域2
      (list (cons "面积        " Area)                                 ;返回各种参数值
            (cons "周长        " Perimeter)
            (cons "质心        " Centroid)
            (cons "X 轴主惯性矩" (car PrincipalMoments))
            (cons "X 轴惯性矩  " (car MomentOfInertia1))
            (cons "Y 轴主惯性矩" (cadr PrincipalMoments))
            (cons "Y 轴惯性矩  " (cadr MomentOfInertia1))
            (cons "XY惯性积    " ProductOfInertia1)
            (cons "X 轴上抗弯距" Wx2)
            (cons "X 轴下抗弯距" Wx1)
            (cons "Y 轴左抗弯距" Wy1)
            (cons "Y 轴右抗弯距" Wy2)
            (cons "X 轴面积矩  " Sx )
            (cons "Y 轴面积矩  " Sy )
            (cons "回旋半径ix  " (car RadiiOfGyration))
            (cons "回旋半径iy  " (cadr RadiiOfGyration))
            (cons "主矩方向1   " (list (car PrincipalDirections) (caddr PrincipalDirections)))
            (cons "主矩方向2   " (list (cadr PrincipalDirections) (cadddr PrincipalDirections)))
            (cons "距左边距离  " (abs (car minpt)))
            (cons "距右边距离  " (abs (car maxpt)))
            (cons "距上边距离  " (abs (cadr maxpt)))
            (cons "距下边距离  " (abs (cadr minpt)))
      )
    )
  )
)
;;;用ActiveX的方式画矩形面域
(defun draw-rectange (recpts / pts rec reg)
  (setq pts (vlax-make-safearray vlax-vbdouble '(0 . 7)))
  (vlax-safearray-fill pts recpts)
  (setq rec (vla-addlightweightPolyline *MSp pts));创建矩形
  (vla-put-closed rec 1)                          ;封闭矩形
  (setq reg (vla-addregion *MSp (O2L rec)))       ;对矩形求面域
  (vla-delete rec)                                  ;删除矩形的轻多段线
  (car (V2L reg))                                 ;取得矩形面域物体
)
;;;ActiveX的变量转化为lisp列表
(defun V2L (x)
  (vlax-safearray->list (vlax-variant-value x))
)
;;;把选择集的物体转化为安全数组
(defun S2A (ss / i l objs curves)
  (setq i -1 l (sslength ss) objs nil)
  (repeat l
    (setq objs (cons (vlax-ename->vla-object (ssname ss (setq i (1+ i)))) objs))
  )
  (setq curves (vlax-make-safearray vlax-vbobject (eval '(cons 0 (1- l)))))
  (vlax-safearray-fill curves objs)
)
;;;把选择集的物体转化为Lisp表
(defun S2L (ss / i l objs)
  (setq i -1 l (sslength ss) objs nil)
  (repeat l
    (setq objs (cons (vlax-ename->vla-object (ssname ss (setq i (1+ i)))) objs))
  )
)
;;;物体组成lisp列表
(defun O2L (obj / curves)
  (setq curves (vlax-make-safearray vlax-vbobject '(0 . 0)))
  (vlax-safearray-fill curves (list obj))
)
;;;打印截面表并计数
(defun GetNum (regobjs Num / Number reglst)
  (setq Number Num)                                 ;计数归零
  (foreach obj regobjs                                 
    (setq reglst (mas obj))                       ;对其分别求值
    (princ obj)                                          ;打印region名
    (princ "\n下面为该物体的参数的列表: ")
    (foreach n reglst (princ "\n") (princ n))     ;打印region参数表
    (setq Number (1+ Number))                     ;计数累加
  )
)
;;;表转化成字符串
(defun list->string (lst)
  (strcat "(" (apply 'strcat (mapcar '(lambda (x) (strcat (rtos x) " ")) lst)) ")")
)
;;;写数据函数
(defun WrData (regobjs Num / Number reglst string str1 str2 str)
  (setq Number Num)                               ;计数归零
  (foreach obj regobjs                                 
    (setq reglst (mas obj))                       ;对其分别求值
    (setq Number (1+ Number))                     ;计数累加
    (write-line "***********************************" file)
    (setq string (strcat "截面" (itoa Number) "的参数表:"))
    (write-line string file)                      ;写入region名
    (foreach n reglst
      (setq str1 (car n))                         ;参数名称
      (if (listp (setq str2 (cdr n)))             ;参数值
        (setq str2 (list->string str2))         
        (setq str2 (rtos str2))
      )
      (setq str (strcat str1 ": " str2))
      (write-line str file)                       ;写入region参数表
    )                                             
  )
  Number
)
;;;以下测试程序
(defun C:test (/ i j ss ss1 err objlst REGs W&P OLDCMD file)
  (vl-load-com)
  (setq        *Obj (vlax-get-acad-object)
        *Doc (vla-get-activeDocument *Obj)
        *MSp (vla-get-Modelspace *Doc)
  )
  (princ)
  (princ "\n单位和精度由ACAD确定,可自己控制,选择封闭线段物体,或者region物体,         
          \n在提示数据输出方式时,按下P或W键,P代表屏幕输出,W则在C:盘创建数据。
          \n请尊重原创者,勿用于商业目的!!    Highflybird   2007.1.23  KunMing")
  (if (setq ss (ssget))                           ;建立选择集
    (progn
      (initget 1 "W P")                           ;选择写入文件或屏幕打印
      (setq W&P (getkword "\n确定输出数据方式:\n写入文件[W]或屏幕打印[P])?"))
      (princ "\n")   
      (setq OLDCMD (getvar "CMDECHO"))
      (setvar "CMDECHO" 0)
      (command ".UCS" "W")
      (setq objlst (S2A ss))                      ;选择集列表
      (setq file (open "C:\\截面几何参数.dat""w"));打开文件
      (if (setq ss1 (ssget "P" '((0 . "REGION"))));选择集中已有的region
        (setq i (if (= W&P "P")                   ;计算并求出region数目
                  (GetNum (S2L ss1) 0)                  
                  (Wrdata (S2L ss1) 0)
                )
        )
        (setq i 0)
      )                           
      (defun addreg ()
        (setq REGs (vla-addregion *Msp objlst))
      )
      (setq err (vl-catch-all-apply 'addreg))     ;建立区域并出错检测
      (if (vl-catch-all-error-p err)              ;如果没有新建任何region
        (setq j 0)                                ;则计数为0
        (setq REGs (V2L REGs)                     ;否则转化成region集合
              i (if (= W&P "P")                   ;计算并求出region数目
                  (GetNum REGs i)                 
                  (Wrdata REGs i)
                )
              j (mapcar 'vla-delete REGs)         ;删除刚建立的截面
        )
      )
      (close file)                                ;关闭文件
      (if (/= 0 i)
        (progn
          (princ "\n\n已经列出")
          (princ i)
          (princ "个截面几何参数表.")
        )
        (alert "没有选中有效的截面!")
      )
      (command ".UCS" "P")
      (setvar "CMDECHO" OLDCMD)
    )
    (alert "你没有选中物体! ")
  )
  (princ)
)
[/pcode]源码在此:
请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:截面几何参数.lsp 
下载次数:226  文件大小:11.1 KB 
下载权限: 不限 以上  [免费赚D豆]



评分

参与人数 1D豆 +5 贡献 +1 收起 理由
xshrimp + 5 + 1 技术引导讨论和指点奖!

查看全部评分

本帖被以下淘专辑推荐:

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

已领礼包: 8121个

财富等级: 富甲天下

 楼主| 发表于 2007-1-23 16:29:03 | 显示全部楼层
下面图中显示的分别是Msteel工具,豪沃克工具,和我的lisp程序计算出来的结果
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-3-27 17:26:46 | 显示全部楼层
谢谢楼主,很好用,也谢谢给出的代码,有个小小请求:能不能把输出直接输出到cad图中,或采用浮动显示的方式,这样更方便点,因为生成的数值用F2看还是稍显麻烦了点!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 2026个

财富等级: 金玉满堂

发表于 2014-8-15 16:23:03 | 显示全部楼层
沉积多年的力学计算小程序,谢谢楼主源代码,也谢谢楼上的发现。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 85个

财富等级: 招财进宝

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

使用道具 举报

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

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 158个

财富等级: 日进斗金

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 07:01 , Processed in 0.547456 second(s), 61 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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