找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1272|回复: 5

[LISP函数]:★★★AEC门窗墙自定义实体的Vlisp函数★★★

[复制链接]
发表于 2008-12-9 14:02:22 | 显示全部楼层 |阅读模式

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

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

×
*** YAD门窗墙函数说明 ***

1、添加墙体---返回实体名
  (yad-addwall style hatch scale spt ept mpt width high layer)
   style  “直墙”或“弧墙”
   hatch  墙体填充名称或nil
   scale  填充比例或nil
   spt    墙体起点
   ept    墙体终点
   mpt    弧墙第二点或nil
   width  墙体厚度
   high   墙体高度
   layer  图层名称
如:(yad-addwall "直墙" "ANSI31" 20 (getpoint) (getpoint) nil 200 3000 "墙")

2、添加门窗---返回实体名
  (yad-adddoorwindow style block scale ipt width high open layer)
   style  “门”或“窗”
   block  门窗图块名称或nil
   scale  图块比例方式或nil[0自动适合墙厚 1保持长宽比]
   ipt    门窗插入位置
   width  门窗宽度
   high   门窗高度
   open   开启方向[1或2或3或4]
   layer  图层名称
如:(yad-adddoorwindow "门" nil nil (getpoint) 900 2100 1 "门")

3、获取门窗墙属性---返回属性列表[属性参考上面的添加函数]
  (yad-getarchval ent)
   ent    门窗墙对象实体
如:(yad-getarchval (car (entsel)))

4、更改门窗墙属性---返回nil
  (yad-putarchval ent lst val)
   ent    门窗墙对象实体
   lst    属性列表[属性参考上面的添加函数]
   val    对应属性的新值列表
如:(yad-putarchval (car (entsel)) '("hatch" "width" "high") '("solid" 240 3600))

示例程序和函数下载:http://www.mjtd.com/bbs/dispbbs. ... ID=72471&page=1
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2008-12-9 14:56:09 | 显示全部楼层
vlisp可以自定义实体。。。这个是什么概念。
沙发,学习一下
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-12-9 19:46:10 | 显示全部楼层
;;***** 利用yadarch函数开发的示例程序(For AutoCAD 2005~2009) *****

;;画墙
(defun c:wall(/ lay oldort pt1 pt2 val)
  (setvar "cmdecho" 0)
  (if (not wall_h) (setq wall_h 3000))
  (if (not wall_w) (setq wall_w 200))
  (if (not wall_sty) (setq wall_sty "直墙"))
  (vl-cmdf "_.layer" "_m" (setq lay "墙") "_c" "41" "" "")
  (setq oldort (getvar "orthomode"))
  (while (or (initget "H W S") (setq pt1 (getpoint (strcat "\n***" wall_sty "、墙高=" (itoa wall_h) "、墙厚=" (itoa wall_w) "***\n" wall_sty "起点[墙高(H)/墙厚(W)/形式(S)]: "))))
    (cond
      ((= pt1 "H")
        (setq wall_h (if (and (setq val (getint "\n墙体高度:")) (/= (setq val (abs val)) 0)) val wall_h))
      )
      ((= pt1 "W")
        (setq wall_w (if (and (setq val (getint "\n墙体厚度:")) (/= (setq val (abs val)) 0)) val wall_w))
      )
      ((= pt1 "S")
        (initget "L A")
        (setq val (getkword (strcat "\n选择墙体形式[直墙(L)/弧墙(A)]:<" (if (= wall_sty "直墙") "L" "A") ">")))
        (if val (setq wall_sty (if (= val "L") "直墙" "弧墙")))
      )
      ((= wall_sty "直墙")
        (setvar "orthomode" oldort)
        (while (setq pt2 (getpoint pt1 "\n直墙下一点:"))
          (yad-addwall wall_sty nil nil pt1 pt2 nil wall_w wall_h lay)
          (setq pt1 pt2)
        )
      )
      (T
        (setvar "orthomode" 0)
        (while (and (setq pt2 (getpoint pt1 "\n弧墙终点:"))
                    (not (grdraw pt1 pt2 1 1))
                    (setq pt3 (getpoint (yad-midpt pt1 pt2) "\n弧墙上的第二点:"))
               )
          (yad-addwall wall_sty nil nil pt1 pt2 pt3 wall_w wall_h lay)
          (setq pt1 pt2)
          (redraw)
        )
        (redraw)
      )
    )
  )
  (setvar "orthomode" oldort)
  (princ)
)
;;移动墙体端点
(defun c:movewallpt(/ ent pt lst spt ept mpt pt1 sty)
  (while (and (setq ent (entsel "\n点取墙体端点:")) (setq pt (cadr ent) ent (car ent)))
    (if (= (cdr (assoc 0 (entget ent))) "AEC_WALL")
      (progn
        (setq lst (yad-getarchval ent) spt (cadr (assoc "spt" lst)) ept (cadr (assoc "ept" lst)) mpt (cadr (assoc "mpt" lst)))
        (if (> (distance ept pt) (distance spt pt))
          (setq pt1 spt sty "spt")
          (setq pt1 ept sty "ept")
        )
        (if (and mpt (> (distance pt pt1) (distance pt mpt)))
          (setq pt1 mpt sty "mpt")
        )
        (if (setq pt (getpoint pt1 (strcat "\n点取墙体" (cdr (assoc sty '(("spt" . "起点")("ept" . "终点")("mpt" . "中点")))) "的移动位置:")))
          (yad-putarchval ent (list sty) (list pt))
        )
      )
      (prompt "\n不是墙体!")
    )
  )
  (princ)
)
;;插入门窗
(defun doorwindow(sty / oldos pt val)
  (setvar "cmdecho" 0)
  (if (not door_h) (setq door_h 2100))
  (if (not door_w) (setq door_w 900))
  (if (not window_h) (setq window_h 1500))
  (if (not window_w) (setq window_w 1200))
  (vl-cmdf "_.layer" "_m" sty "_c" (if (= sty "门") "161" "91") "" "")
  (setq oldos (getvar "osmode"))
  (setvar "osmode" 512)
  (while (or (initget "H W")
             (setq pt (getpoint (strcat "\n***" sty "高=" (itoa (if (= sty "门") door_h window_h)) "、" sty "宽=" (itoa (if (= sty "门") door_w window_w)) "***\n点取墙体插入位置[高度(H)/宽度(W)]: ")))
         )
    (cond
      ((= pt "H")
        (if (= sty "门")
          (setq door_h (if (and (setq val (getint "\n门高度:")) (/= (setq val (abs val)) 0)) val door_h))
          (setq window_h (if (and (setq val (getint "\n窗高度:")) (/= (setq val (abs val)) 0)) val window_h))
        )
      )
      ((= pt "W")
        (if (= sty "门")
          (setq door_w (if (and (setq val (getint "\n门宽度:")) (/= (setq val (abs val)) 0)) val door_w))
          (setq window_w (if (and (setq val (getint "\n窗宽度:")) (/= (setq val (abs val)) 0)) val window_w))
        )
      )
      (T
        (yad-adddoorwindow sty nil nil pt (if (= sty "门") door_w window_w) (if (= sty "门") door_h window_h) 1 sty)
      )
    )
  )
  (setvar "osmode" oldos)
  (princ)
)
;;插入门
(defun c:door()(doorwindow "门"))
;;插入窗
(defun c:window()(doorwindow "窗"))
;;门窗翻转
(defun mirdoorwindow(sty / ent lst open)
  (while (and (setq ent (entsel "\n点取要翻转的门窗:")) (setq ent (car ent)))
    (if (wcmatch (cdr (assoc 0 (entget ent))) "AEC_DOOR,AEC_WINDOW")
      (progn
        (setq lst (yad-getarchval ent) open (cadr (assoc "open" lst)))
        (cond
          ((= open 1) (setq open (if (= sty 0) 2 4)))
          ((= open 2) (setq open (if (= sty 0) 1 3)))
          ((= open 3) (setq open (if (= sty 0) 4 2)))
          ((= open 4) (setq open (if (= sty 0) 3 1)))
          (T)
        )
        (yad-putarchval ent '("open") (list open))
      )
      (prompt "\n不是门窗!")
    )
  )
  (princ)
)
;;左右翻转
(defun c:mirlr() (mirdoorwindow 0))
;;内外翻转
(defun c:mirio() (mirdoorwindow 1))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-12-15 14:46:53 | 显示全部楼层
命令: wall
***直墙、墙高=3000、墙厚=200***
直墙起点[墙高(H)/墙厚(W)/形式(S)]:
直墙下一点:; 错误: no function definition: YAD-ADDWALL
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2009-11-27 10:54:01 | 显示全部楼层
***直墙、墙高=3000、墙厚=200***
直墙起点[墙高(H)/墙厚(W)/形式(S)]:
直墙下一点:; 错误: no function definition: YAD-ADDWALL
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1757个

财富等级: 堆金积玉

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-25 16:28 , Processed in 0.444687 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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