明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 878|回复: 14

新人第一次发帖

[复制链接]
发表于 2022-12-6 14:44 | 显示全部楼层 |阅读模式
最近在画新建建筑底图时,经常画一些开洞符号

论坛上很多大佬开发了很强的代码
不过,本人小白,对一些高级代码比较难理解
就自己写一个比较麻烦的~
各位前辈大佬多批评指正~
  1. (defun c:JS-HKD ( / a b c d x0 x1 y0 y1 p1 p2 p3 p4 p11 p22)
  2.   (setq #k (getvar "clayer")) ;;取得当前图层
  3.   (command "layer" "M" "S_辅助线" "C" 3 "" "")
  4.   (setq p1 (getpoint"\n输入矩形的一个角点"))
  5.   (setq p2 (getpoint"\n输入矩形的另一角点"))
  6.   ;分离坐标
  7.   (setq a (car p1))
  8.   (setq b (cadr p1))
  9.   (setq c (car p2))
  10.   (setq d (cadr p2))
  11.   ;判断取值
  12.   (setq x0 (min a c))
  13.   (setq y0 (min b d))
  14.   (setq x1 (max a c))
  15.   (setq y1 (max b d))
  16.   ;赋值/对角坐标点
  17.   (setq p11 (list x0 y0))
  18.   (setq p22 (list x1 y1))
  19.   ;读取差值
  20.   (setq -x (- x1 x0))
  21.   (setq -y (- y1 y0))
  22.   ;给定折点
  23.   (setq p3 (list (+ x0 (/ -x 4))(+ y0 (* -y 0.6))))
  24.   ;绘图
  25.   (command "rectangle" p11 p22 "")
  26.   (command "pline" p11 p3 p22 "")
  27.   (setvar "clayer" #k)        ;;恢复原来图层
  28. (princ)
  29. )


发表于 2022-12-8 02:04 | 显示全部楼层
本帖最后由 kucha007 于 2022-12-8 02:09 编辑

又试了一下,加了线型

  1. (defun c:TT (/ Old_Cmd Old_OSM obj ptlist pmin pmax pmid co lt *ent*)
  2.   (setq Old_Cmd (getvar "cmdecho"))
  3.   (setq Old_OSM (getvar "OSMode"))
  4.   (defun *error* ( msg );定义出错函数
  5.       (setvar "cmdecho" Old_Cmd)
  6.       (setvar "OSMode" Old_OSM)
  7.   )
  8.   (setvar "cmdecho" 0)
  9.   (command "_.rectangle" "_fillet" 0.0) ;圆角归零
  10.   (while (/= 0 (getvar 'cmdactive))(vl-cmdf pause))
  11.   (setvar "OSMode" 0)
  12.   (if (and
  13.           (setq obj (entget (entlast)))
  14.           (setq ptlist
  15.               (vl-sort
  16.                     (mapcar
  17.                         '(lambda (pt)
  18.                             (trans
  19.                               (list
  20.                                 (car pt);X
  21.                                 (cadr pt);Y
  22.                                 (cdr (assoc 38 obj)) ;Z
  23.                               )
  24.                               0 1
  25.                             )
  26.                         );WCS to UCS
  27.                         (mapcar 'cdr
  28.                             (vl-remove-if '(lambda (x) (/= (car x) 10)) obj)
  29.                         );获取WCS坐标
  30.                     );获取UCS点集
  31.                   '(lambda (a b)
  32.                           (cond
  33.                             ((= (car a) (car b)) (< (cadr a) (cadr b)));如果x相等,就比较y
  34.                             ((< (car a) (car b))) ;如果x不相等,就比较x
  35.                           )
  36.                       )
  37.               ) ;排序:先X后Y
  38.           )
  39.           (setq pmin (car ptlist))
  40.           (setq pmax (car (reverse ptlist)))
  41.           (setq pmid (mapcar '+
  42.                             pmin
  43.                             (mapcar '* (mapcar '- pmax pmin) '(0.25 0.6))
  44.                     )
  45.           )
  46.       )
  47.       (progn
  48.           (command "_.pline" pmin pmid pmax "")
  49.           (setq *ent* (entget (entlast)))
  50.           (setq co 8);8号色
  51.           (setq lt "DASHED");线型
  52.           (if (assoc 62 *ent*)
  53.             (entmod (subst (cons 62 co) (assoc 62 *ent*) *ent*)) ;替换颜色
  54.             (entmod (append *ent* (list (cons 62 co)))) ;添加颜色
  55.           )
  56.           (if (not (tblsearch "ltype" lt))
  57.             (vla-load (vla-get-linetypes (vla-get-activedocument (vlax-get-acad-object))) lt "acadiso.lin")
  58.           )
  59.           (if (assoc 6 *ent*)
  60.             (entmod (subst (cons 6 lt) (assoc 6 *ent*) *ent*)) ;替换线型
  61.             (entmod (append *ent* (list (cons 6 lt)))) ;添加线型
  62.           )
  63.       )
  64.   )
  65.   (setvar "cmdecho" Old_Cmd)
  66.   (setvar "OSMode" Old_OSM)
  67.   (princ)
  68. )


回复 支持 1 反对 0

使用道具 举报

发表于 2022-12-6 21:45 | 显示全部楼层
本帖最后由 kucha007 于 2022-12-7 04:44 编辑

也尝试了一下
  1. (defun c:TT (/ Old_Cmd Old_OSM obj ptlist pmin pmax pmid Col *ent*)
  2.   (setq Old_Cmd (getvar "cmdecho"))
  3.   (setq Old_OSM (getvar "OSMode"))
  4.   (defun *error* ( msg );定义出错函数
  5.       (setvar "cmdecho" Old_Cmd)
  6.       (setvar "OSMode" Old_OSM)
  7.   )
  8.   (setvar "cmdecho" 0)
  9.   (command "_.rectangle" "_fillet" 0.0) ;圆角归零
  10.   (while (/= 0 (getvar 'cmdactive))(vl-cmdf pause))
  11.   (setvar "OSMode" 0)
  12.   (if (and
  13.           (setq obj (vlax-ename->vla-object (entlast)))
  14.           (setq ptlist (vl-sort
  15.                         (list
  16.                           (trans (vlax-curve-getPointAtParam obj 0) 0 1)
  17.                           (trans (vlax-curve-getPointAtParam obj 1) 0 1)
  18.                           (trans (vlax-curve-getPointAtParam obj 2) 0 1)
  19.                           (trans (vlax-curve-getPointAtParam obj 3) 0 1)
  20.                         ) ;list
  21.                         '(lambda (a b)
  22.                               (cond
  23.                                 ((= (car a) (car b));如果x相等,就比较y
  24.                                 (< (cadr a)(cadr b)));
  25.                                 ((< (car a) (car b)));如果x不相等,就比较x
  26.                               )
  27.                           )
  28.                       )
  29.           )
  30.           (setq pmin (car ptlist))
  31.           (setq pmax (car (reverse ptlist)))
  32.           (setq pmid (mapcar '+
  33.                             pmin
  34.                             (mapcar '* (mapcar '- pmax pmin) '(0.25 0.6))
  35.                     )
  36.           )
  37.       )
  38.       (progn
  39.           (command "_.pline" pmin pmid pmax "")
  40.           (setq *ent* (entget (entlast)))
  41.           (setq Col 8) ;设置颜色
  42.           (if (assoc 62 *ent*)
  43.             (entmod (subst (cons 62 Col) (assoc 62 *ent*) *ent*)) ;替换颜色
  44.             (entmod (append *ent* (list (cons 62 Col)))) ;添加颜色
  45.           )
  46.       )
  47.   )
  48.   (setvar "cmdecho" Old_Cmd)
  49.   (setvar "OSMode" Old_OSM)
  50.   (princ)
  51. )


发表于 2022-12-6 15:34 | 显示全部楼层
(defun c:tt (/ #k d p1 p11 p2 p22 p3)
  (setq #k (getvar "clayer")) ;;取得当前图层
  (command "layer" "M" "S_辅助线" "C" 3 "" "")
  (setq p1 (getpoint"\n输入矩形的一个角点"))
  (setq p2 (getcorner p1"\n输入矩形的另一角点"))
  (setq p11 (mapcar 'min p1 p2))
  (setq p22 (mapcar 'max p1 p2))
  (setq d(mapcar '- p22 p11))
  (setq p3(mapcar '+ p11 (mapcar '* d'(0.25 0.6))))
  (command "rectangle" p11 p22 "")
  (command "pline" p11 p3 p22 "")
  (setvar "clayer" #k)        ;;恢复原来图层
        (princ)
)

用getcorner效果更好
发表于 2022-12-6 15:37 | 显示全部楼层
不错呀。开始入坑了。
发表于 2022-12-6 16:38 | 显示全部楼层
  (setq linetypeName "CENTER2")
  (setq        err (vl-catch-all-apply
              'vla-Load
              (list (vla-get-Linetypes AcadDocument)
                    linetypeName
                    "acad.lin"
              )
            )
  )


(IF (NOT (TBLSEARCH "LAYER" zxtc))
        (entmake
          (list        '(0 . "LAYER")
                '(100 . "AcDbSymbolTableRecord")
                '(100 . "AcDbLayerTableRecord")
                '(70 . 0)
                '(6 . "Center2")
                (cons 62 x)
                (cons 2 zxtc)
          )
        )
      )
参考上段代码,这样就不用重复新建图层了
发表于 2022-12-6 19:57 来自手机 | 显示全部楼层
可以了,达到目的就行,即使有小问题,自己的使用环境习惯注意就行了
 楼主| 发表于 2022-12-6 20:43 | 显示全部楼层
tryhi 发表于 2022-12-6 15:34
(defun c:tt (/ #k d p1 p11 p2 p22 p3)
  (setq #k (getvar "clayer")) ;;取得当前图层
  (command "lay ...

海总出马,代码一下就高大上了
 楼主| 发表于 2022-12-6 20:47 | 显示全部楼层
自贡黄明儒 发表于 2022-12-6 15:37
不错呀。开始入坑了。

大佬见笑啦~~
 楼主| 发表于 2022-12-6 20:53 | 显示全部楼层
liuhe 发表于 2022-12-6 16:38
(setq linetypeName "CENTER2")
  (setq        err (vl-catch-all-apply
              'vla-Load

感谢大佬~ 不明觉厉!我还得多多学习
发表于 2022-12-7 09:03 | 显示全部楼层
长宽比出来的洞口线比例不好看,希望再次改进下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-18 14:08 , Processed in 0.228171 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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