乐筑天下

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

[编程交流] 区域命令帮助?

[复制链接]

29

主题

84

帖子

55

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2022-7-6 09:03:08 | 显示全部楼层 |阅读模式
你好
任何人都可以编写autolisp以使用area命令并将结果作为文本字符串插入绘图区域吗
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 09:12:42 | 显示全部楼层
这应该让你开始:
  1. (command "_AREA" pause)
  2. (setq MyArea (getvar "AREA"))

 
注意RTOS函数以所需格式进行字符串转换。
 
Regads,
米尔恰
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
211
发表于 2022-7-6 09:15:44 | 显示全部楼层
真的很简单。。但是
 
单位?
区域信息的来源是什么?实体?从读取外部文件?属性块中的值?
 
  1. (defun c:GetArea (/ area sset)
  2.       (vl-load-com)
  3.       (ssget);<--- insert filter here
  4.       (setq area 0)
  5.      (vlax-for H (setq sset (vla-get-activeselectionset
  6.                                     (vla-get-activedocument
  7.                                           (vlax-get-acad-object))))
  8.              (setq area (+ (vla-get-area h) area))
  9.              )
  10.       (vla-delete sset)
  11. (alert
  12.       (strcat
  13.             "\nTotal area = "
  14.             (if (or (= (getvar "lunits") 3)
  15.                     (= (getvar "lunits") 4))
  16.                   (strcat
  17.                         (rtos area 2)
  18.                         " sq. in. ("
  19.                         (rtos (/ area 144) 2)
  20.                         " sq. ft.)")
  21.                   (rtos area))))
  22.       )

 
记住:按顺序选择点
 
 
 
用这些条件写出来会很好
通过窗口选择选择点
对点进行排序(以某种方式)
仅从点导出面积(不创建pline)
给出面积/周长
现在编写代码很有趣
回复

使用道具 举报

29

主题

84

帖子

55

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2022-7-6 09:23:31 | 显示全部楼层
再看一遍这篇文章,我觉得我有点过火了
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
211
发表于 2022-7-6 09:26:45 | 显示全部楼层
..................区域起点。LSP
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
211
发表于 2022-7-6 09:32:04 | 显示全部楼层
远不及艾伦的优雅
 
但它应该起作用:
 
  1. (defun c:AreaFromPoints (/ PtList i area)
  2. (defun LWPoly (lst cls)
  3. (entmakex (append (list (cons 0 "LWPOLYLINE")
  4.                          (cons 100 "AcDbEntity")
  5.                          (cons 100 "AcDbPolyline")
  6.                          (cons 90 (length lst))
  7.                          (cons 70 cls))
  8.                    (mapcar (function (lambda (p) (cons 10 p))) lst))))      
  9. (setq pts (ssget ":L" '((0 . "POINT"))))
  10. (repeat (setq i (sslength pts))
  11.            (setq PtList (cons
  12.            (cdr (assoc 10 (entget (ssname pts (setq i (1- i)))))) PtList)
  13.            )
  14.      )
  15.      (Lwpoly PtList 1)
  16.      (setq area (vla-get-area (vlax-ename->vla-object (entlast))))
  17.      (entdel (entlast))
  18.      (princ
  19.      (strcat
  20.             "\nTotal area = "
  21.             (if (or (= (getvar "lunits") 3)
  22.                     (= (getvar "lunits") 4))
  23.                   (strcat
  24.                         (rtos area 2)
  25.                         " sq. in. ("
  26.                         (rtos (/ area 144) 2)
  27.                         " sq. ft.)")
  28.                   (rtos area)))
  29.      )
  30.      (princ)
  31.      )

 
-大卫
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 09:40:05 | 显示全部楼层
谢谢大家
我的目标是使用autocad命令\u measuregeom(精确地说是area),但我希望将此autocad命令的结果作为文本插入绘图区域。我有办公室、餐厅和房间的计划。
我想计算并输入前面提到的每一个的面积值,以用于以后的冷负荷计算。(暖通空调)
我希望你已经明白我想要什么。
可能有点像附件
获取区域。lsp
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 09:41:40 | 显示全部楼层
 
  1. ;=======================================================================
  2. ;    DYN-Area.Lsp                                    Aug 12, 2011
  3. ;    Dynamic Area Calulations
  4. ;================== Start Program ======================================
  5. (princ "\nCopyright (C) 1990-2011, Fabricated Designs, Inc.")
  6. (princ "\nLoading DYN-Area v1.0 ")
  7. (setq dya_ nil lsp_file "DYN-Area")
  8. ;++++++++++++ Set Modes & Error ++++++++++++++++++++++++++++++++++
  9. (defun dya_smd ()
  10. (SetUndo)
  11. (setq olderr *error*
  12.      *error* (lambda (msg)
  13.                (while (> (getvar "CMDACTIVE") 0)
  14.                       (command))
  15.                (and (/= msg "quit / exit abort")
  16.                     (princ (strcat "\nError: *** " msg " *** ")))
  17.                (and (= (logand (getvar "UNDOCTL")  8)
  18.                     (command "_.UNDO" "_END" "_.U"))
  19.                (dya_rmd))
  20.       dya_var '(("CMDECHO"   . 0) ("COORDS"    . 2)
  21.                 ("OSMODE"    . 0) ("SORTENTS"   . 119)
  22.                 ("BLIPMODE"  . 0) ("ORTHOMODE"  . 0)
  23.                 ("SNAPMODE"  . 0) ("PLINEWID"   . 0)
  24.                 ("ELEVATION" . 0) ("THICKNESS"  . 0)
  25.                 ("CECOLOR"   . "BYLAYER")
  26.                 ("CELTYPE"   . "BYLAYER")))
  27. (foreach v dya_var
  28.   (and (getvar (car v))
  29.        (setq dya_rst (cons (cons (car v) (getvar (car v))) dya_rst))
  30.        (setvar (car v) (cdr v))))
  31. (princ))
  32. ;++++++++++++ Return Modes & Error +++++++++++++++++++++++++++++++
  33. (defun dya_rmd ()
  34. (setq *error* olderr)
  35. (foreach v dya_rst (setvar (car v) (cdr v)))
  36. (command "_.UNDO" "_END")
  37. (prin1))
  38. ;++++++++++++ Set And Start An Undo Group ++++++++++++++++++++++++
  39. (defun SetUndo ()
  40. (and (zerop (getvar "UNDOCTL"))
  41.      (command "_.UNDO" "_ALL"))
  42. (and (= (logand (getvar "UNDOCTL") 2) 2)
  43.      (command "_.UNDO" "_CONTROL" "_ALL"))
  44. (and (= (logand (getvar "UNDOCTL")  8)
  45.      (command "_.UNDO" "_END"))
  46. (command "_.UNDO" "_GROUP"))
  47. ;************ Main Program ***************************************
  48. (defun dya_ (/ olderr dya_var dya_rst sp pl np tl)
  49. (dya_smd)
  50. (initget 1)
  51. (setq sp (getpoint "\n1st Point:   "))
  52. (setq pl (list sp))
  53. (while (setq np (getpoint sp "\nNext Point - (Enter to Exit):   "))
  54.         (setq pl (cons np pl)
  55.               tl pl
  56.               sp np)
  57.         (command "_.PLINE")
  58.           (foreach p pl (command p))
  59.         (command "_CL")
  60.         (command "_.AREA" "_E" (entlast))
  61.         (command "_.ERASE" (entlast) "")
  62.         (princ (strcat " = " (rtos (getvar "AREA"))))
  63.         (redraw)
  64.         (repeat (1- (length tl))
  65.                 (grdraw (nth 0 tl) (nth 1 tl) 2 1)
  66.                 (setq tl (cdr tl)))
  67.         (grdraw (nth 0 tl) np 2 1))
  68. (redraw)
  69. (repeat (1- (length pl))
  70.          (grdraw (nth 0 pl) (nth 1 pl) 7 1)
  71.          (setq pl (cdr pl)))
  72. (grdraw (nth 0 pl) sp 7 1)
  73. (princ (strcat " = " (rtos (getvar "AREA"))))
  74. (dya_rmd))
  75. ;************ Load Program ***************************************
  76. (defun C:DYN-Area () (dya_))
  77. (if dya_ (princ "\nDYN-Area Loaded\n"))
  78. (prin1)
  79. ;|================== End Program =======================================

尼塞尔
 
谢谢Alanjt
 
 
你太谦虚了大卫
干得好
回复

使用道具 举报

29

主题

84

帖子

55

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2022-7-6 09:47:08 | 显示全部楼层
 
你指的是屏幕上的点,而不是实体点
 
在这种情况下,像这样简单的事情就行了
  1. (mapcar '(lambda (a b) (grdraw a b 7))
  2.              (setq lst (if (eq pt "Undo")
  3.                          (cdr lst)
  4.                          (cons pt lst)
  5.                        )
  6.              )
  7.              (cons (last lst) lst)
  8.      )

 
我想尝试一下_measuregeom方法,不幸的是,我不知道它做什么。您可以在“\u measuregeom”之后立即使用类似的内容
 
  1. (defun c:test (/ pt1 pt2 pt3 LxW str)
  2.      (setq pt1 (getpoint "\nLower Left Corner:")
  3.            pt3 (getcorner pt1 "\nLower Upper Rigbt  Corner:"))
  4.      (setq pt2 (list (car pt1) (cadr pt3) 0.0))
  5.      (setq LxW (list (distance pt1 pt2) (distance pt2 pt3)))
  6.      (setq str
  7.      (if (or (= (getvar "lunits") 3)
  8.                     (= (getvar "lunits") 4))
  9.                   (strcat                        
  10.                           (rtos (/ (apply '* Lxw) 144) 2)
  11.                         " sq. ft.")
  12.                   (strcat (rtos (apply '* Lxw)) " m²")
  13.          )
  14.            )
  15.      (command "_text" "_Justify" "_center" "_non" (mapcar (function (lambda (a b) (/ (+ a b) 2.))) pt1 pt3)
  16.            (getvar 'TextSize) 0 str)
  17. )

 
提醒:
(命令“\u text”“\u Justify”“\u center”“\u non”pt(getvar'TextSize)0 str)
如果当前文字样式高度非零,则上面的行将跳过文字高度提示,并将(getvar的TextSize)作为旋转,将0作为STR。
 
 
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
211
发表于 2022-7-6 09:55:54 | 显示全部楼层
 
这里有一个快速的
  1. (defun c:test (/ str pt)
  2. (setq str
  3.                   (if (or (= (getvar "lunits") 3)
  4.                           (= (getvar "lunits") 4))
  5.                         (strcat
  6.                               (rtos (/ (getvar "AREA") 144) 2)
  7.                               " sq. ft.")
  8.                         (strcat (getvar "AREA") " m²")
  9.                         )
  10.              )
  11.      (setq pt (getpoint "\n Select insertion point : "))
  12.      (command "_text" "_Justify" "_center" "_non" pt
  13.            (getvar 'TextSize) 0 str)
  14. )

 
我现在需要弄清楚的是,在使用窗口选择时对PontList进行排序。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-7 06:21 , Processed in 1.106346 second(s), 72 queries .

© 2020-2025 乐筑天下

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