乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 98|回复: 4

[编程交流] 计算固体质量,包括

[复制链接]

20

主题

81

帖子

61

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 10:06:36 | 显示全部楼层 |阅读模式
I frankenbuild 2 autolisp脚本以输出固体的质量(单位:mm密度来自钢0.00782 g/mm^3/7820 kg/m^3)
它还分解所有块,然后撤消,这样你的块就不会受到伤害,但这样它也会使用这些块中的实体。
 
 
卷代码来自lee mac:
http://www.cadtutor.net/forum/showthread.php?37358-如何选择体积值
爆炸代码也来自lee mac:
http://www.cadtutor.net/forum/showthread.php?53107-Xplode所有块
 
这是我的franken构建代码:(记住输出来自mm中的一个部分)
  1. (defun c:vol (/ ss vol bset |cmdecho|)
  2. (vl-load-com)
  3. (SETQ |cmdecho| (GETVAR "cmdecho"))
  4. (SETVAR "cmdecho" 1)
  5. (COMMAND "undo" "begin")
  6. (c:ExplodeAllBlocks)
  7. (COMMAND "undo" "end")
  8. (if (setq ss (ssget '((0 . "3DSOLID"))))
  9.    (progn
  10.      (setq vol
  11.        (apply '+
  12.          (vl-remove-if
  13.            'vl-catch-all-error-p
  14.              (mapcar
  15.                (function
  16.                  (lambda (x)
  17.                    (vl-catch-all-apply
  18.                      'vla-get-volume (list x))))
  19.                (mapcar 'vlax-ename->vla-object
  20.                  (vl-remove-if 'listp
  21.                    (mapcar 'cadr (ssnamex ss))))))))
  22.      (command "undo" "")(princ (strcat "\n<< Total Volume = " (rtos vol 2 2) " >>"))
  23.      (setq volume (rtos vol 2 2)) ))
  24.     (setq massa (* 0.00782 vol)))
  25.   (PRINC (strcat "\n<<mass:" (rtos (/ massa 1000) 2 2) " kg >>"))
  26. (princ)
  27. (SETVAR "cmdecho" |cmdecho|)
  28. )

从lee mac中分解block lisp
  1. (defun c:ExplodeAllBlocks ( / *error* _StartUndo _EndUndo doc locked ss )
  2. (vl-load-com)
  3. ;; © Lee Mac 2010
  4. ;; Error Handler
  5. (defun *error* ( msg )
  6.    (if locked
  7.      (mapcar
  8.        (function
  9.          (lambda ( l )
  10.            (vl-catch-all-apply 'vla-put-lock (list l :vlax-true))
  11.          )
  12.        )
  13.        locked
  14.      )
  15.    )
  16.    (if doc (_EndUndo doc))
  17.    (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
  18.        (princ (strcat "\n** Error: " msg " **")))
  19.    (princ)
  20. )
  21. (defun _StartUndo ( doc ) (_EndUndo doc)
  22.    (vla-StartUndoMark doc)
  23. )
  24. (defun _EndUndo ( doc )
  25.    (if (= 8 (logand 8 (getvar 'UNDOCTL)))
  26.      (vla-EndUndoMark doc)
  27.    )
  28. )
  29. ;; Start an Undo Mark
  30. (_StartUndo
  31.    (setq doc
  32.      (vla-get-ActiveDocument
  33.        (vlax-get-acad-object)
  34.      )
  35.    )
  36. )
  37. ;; Unlock all Layers
  38. (vlax-for l (vla-get-layers doc)
  39.    (if (eq :vlax-true (vla-get-lock l))
  40.      (progn
  41.        (vla-put-lock l :vlax-false)
  42.        (setq locked (cons l locked))
  43.      )
  44.    )
  45. )
  46. ;; Now lets explode 'em
  47. (if (ssget "_X" '((0 . "INSERT")))
  48.    (progn
  49.      (vlax-for obj (setq ss (vla-get-ActiveSelectionSet doc))
  50.        (if (vl-catch-all-error-p
  51.              (vl-catch-all-apply 'vla-Explode (list obj))
  52.            )
  53.          (princ (strcat "\n** Unable to Explode Block: " (vla-get-name obj) " **"))
  54.          (vla-delete obj)
  55.        )
  56.      )
  57.      (vla-delete ss)
  58.    )
  59. )  
  60. ;; ReLock the Layers
  61. (mapcar
  62.    (function
  63.      (lambda ( l ) (vla-put-lock l :vlax-true))
  64.    )
  65.    locked
  66. )
  67. ;; End the Undo mark
  68. (_EndUndo doc)
  69. ;; Exit Cleanly
  70. (princ)
  71. )
回复

使用道具 举报

20

主题

81

帖子

61

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 10:30:52 | 显示全部楼层
我看到我在做一些愚蠢的事情,从一个整数到一个字符串,然后再回来
但至少我现在明白了一点
编辑并修复它
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 10:43:39 | 显示全部楼层
你不需要分解这些块,你可以在不分解的情况下穿过其中包含的对象。但你需要稍微改变一下你的想法。我自己做了一些手脚:
  1. (vl-load-com)
  2. (setq *mass-fact* 0.00782)
  3. ;; Command to calculate the volume of selected objects
  4. (defun c:vol (/ vol:calc vol:calc-block blst sum ss item)
  5. ;; Helper function to calculate a single entity's volume
  6. (defun vol:calc (eo / val)
  7.    (cond
  8.      ((eq (vla-get-ObjectName eo) "AcDbBlockReference")
  9.       (vol:calc-block (vla-get-EffectiveName eo))
  10.      )
  11.      ((not (vl-catch-all-error-p (setq val (vl-catch-all-apply 'vla-get-Volume (list eo))))) val)
  12.      (t 0.0)
  13.    )
  14. )
  15. ;; Helper function to calculate the volume contained within a block definition
  16. (defun vol:calc-block (name / blk item sum)
  17.    (setq sum 0.0)
  18.    (if (setq blk (assoc name blst))
  19.      (setq sum (cdr blk))
  20.      (if (not (vl-catch-all-error-p (setq blk (vl-catch-all-apply 'vla-Item (list *BlocksCollection* name))))
  21.          )
  22.        (progn
  23.          (vlax-for item blk
  24.            (setq sum (+ sum (vol:calc item)))
  25.          )
  26.          (setq blst (cons (cons name sum) blst))
  27.        )
  28.      )
  29.    )
  30.    sum
  31. )
  32. ;; Initialize variables
  33. (setq sum 0.0)
  34. (or *ActiveDocument* (setq *ActiveDocument* (vla-get-ActiveDocument (vlax-get-acad-object))))
  35. (or *BlocksCollection* (setq *BlocksCollection* (vla-get-Blocks *ActiveDocument*)))
  36. ;; Step through a selection set, adding the volume of each item to a sum
  37. (princ "\nSelect entities to calculate volume from: ")
  38. (if (and (setq ss (ssget '((0 . "3DSOLID,INSERT"))))
  39.           (not (vl-catch-all-error-p
  40.                  (setq ss (vl-catch-all-apply 'vla-get-ActiveSelectionSet (list *ActiveDocument*)))
  41.                )
  42.           )
  43.      )
  44.    (vlax-for item ss
  45.      (setq sum (+ sum (vol:calc item)))
  46.    )
  47. )
  48. (princ (strcat "\n<< Total Volume = " (rtos (/ sum (expt 1000.0 3)) 2 3) " m³ >>"))
  49. (princ
  50.    (strcat "\n<< Mass @" (rtos *mass-fact*) " = " (rtos (/ (* *mass-fact* sum) 1000.0) 2 2) " kg >>")
  51. )
  52. (princ)
  53. )
回复

使用道具 举报

20

主题

81

帖子

61

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 11:03:20 | 显示全部楼层
我读过这样一个autolisp魔术非常好!
我可以在help中找到所有vl命令,但现在或做什么:(t0.0)
 
我用Irneb输出计算对我的进行了一点更新,只是为了学习它。
  1. (defun c:vol (/ ss vol bset |cmdecho|)
  2. (setq density 0.00782)
  3. (vl-load-com)
  4. (SETQ |cmdecho| (GETVAR "cmdecho"))
  5. (SETVAR "cmdecho" 0)
  6. (COMMAND "undo" "begin")
  7. (c:ExplodeAllBlocks)
  8. (COMMAND "undo" "end")
  9. (if (setq ss (ssget '((0 . "3DSOLID"))))
  10.    (progn
  11.      (setq vol
  12.        (apply '+
  13.          (vl-remove-if
  14.            'vl-catch-all-error-p
  15.              (mapcar
  16.                (function
  17.                  (lambda (x)
  18.                    (vl-catch-all-apply
  19.                      'vla-get-volume (list x))))
  20.                (mapcar 'vlax-ename->vla-object
  21.                  (vl-remove-if 'listp
  22.                    (mapcar 'cadr (ssnamex ss))))))))
  23.      (command "undo" "")
  24.      (setq volume (rtos vol 2 2)) ))
  25.     (setq massa (* density vol))
  26. (princ (strcat "\n<< Total Volume = " (rtos (/ vol (expt 1000.0 3)) 2 4) " m³ >>"))
  27. (PRINC (strcat "\n<< Mass @" (rtos (* density 1000000) 2 2) " kg/m^3 = " (rtos (/ massa 1000) 2 2) " kg >>"))
  28. (princ)
  29. (SETVAR "cmdecho" |cmdecho|)
  30. )
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 11:10:52 | 显示全部楼层
这是cond的一部分。它可以被视为cond的else部分(与if相对)。例如。:
然后0.0只是传递一个零作为函数的结果。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-6 21:14 , Processed in 0.422374 second(s), 73 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表