明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2096|回复: 6

[提问] 如何让两个函数共用参数并将生成的若干图元做成块?

[复制链接]
发表于 2013-12-20 09:56:18 | 显示全部楼层 |阅读模式
本帖最后由 ou_y_x 于 2013-12-20 10:14 编辑

如下,我写了两个函数1z和2z,现有三个问题,请教各位大大:

1、因它们所用的变量d,n,bj相同,子函数HZX也一样,
我想让两个函数共用这3个变量和子函数HZX,
不想设置为全局变量,怕加载其它插件会有冲突,不知可以怎样实现?

2、函数生成了若干图元,想把其中一部分做为块,分别命名为1Z和2Z,
块的起点和终点在函数里有注释,我搜了一下论坛,有做块的例子,
我想通过获取块里的第一个图元名,用entnext,逐个添加进选择集,
循环至变量名为块里最后一个图元的图元名,不知是否可行。

3、程序看起来很繁琐,哪些地方可以简洁一些。

望各位不吝赐教。小弟先谢过


;;(函数一)-----------------------------------------单桩承台--------------------------------------------
(defun c:1z (/ d n bj p0 p01 p02 p03 p04 px p1 pt1 pt2 pt3 pt4 pc1 pc2 pc3 pc4)
(if (=(tblobjname "LAYER" "DOTE-BASE") nil)
        (progn
        (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") '(70 . 0) '(6 . "DOTE")
   (cons 2 "DOTE-BASE")(cons 62 244)(cons 290 0)))))
(if (=(tblobjname "LAYER" "DOTE-ZH") nil)
        (progn
        (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") '(70 . 0) '(6 . "DOTE")
   (cons 2 "DOTE-ZH")(cons 62 8)))))
(if (=(tblobjname "LAYER" "ILE") nil)
        (progn
        (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") '(70 . 0) '(6 . "DASHED")
   (cons 2 "ILE")(cons 62 6)))))
(if (=(tblobjname "LAYER" "BASE") nil)
        (progn
        (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") '(70 . 0) '(6 . "CONTINUOUS")
   (cons 2 "BASE")(cons 62 7)))))
(if (=(tblobjname "LAYER" "TEXT-BASE") nil)
        (progn
        (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") '(70 . 0) '(6 . "CONTINUOUS")
   (cons 2 "TEXT-BASE")(cons 62 7)))))
(if (=(tblobjname "STYLE" "TSSD_Rein") nil)
        (progn
        (entmake (list '(0 . "STYLE") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbTextStyleTableRecord") '(2 . "TSSD_Rein")
                       '(70 . 0) '(40 . 0) '(41 . 0) '(3 . "tssdeng.shx") '(4 . "hztxt.shx")))))
(setq d 500    ;;d--桩径
      n 3      ;;n--桩距为n倍桩径
      bj 0)    ;;bj--(d+bj)为桩心到承台边的距离,即当bj=0时,桩心到承台边的距离是d
(setq zj (* n d))
(setq p0 (getpoint "指定插入点"))
;;画承台中心-----------------------------------------这是块的起点---------------------------------------------
(setq p01 (polar p0 pi 250)
      p02 (polar p0 0 250)
      p03 (polar p0 (* 1.5 pi) 250)
      p04 (polar p0 (* 0.5 pi) 250))
(entmake (list '(0 . "LINE") (cons 10 p01) (cons 11 p02)(cons 8 "DOTE-BASE")))
(entmake (list '(0 . "LINE") (cons 10 p03) (cons 11 p04)(cons 8 "DOTE-BASE")))
;;画桩和桩中心
  (defun HZX(px / px1 px2 px3 px4)
    (setq px1 (polar px pi (+ (* d 0.5) 100))
          px2 (polar px 0 (+ (* d 0.5) 100))
          px3 (polar px (* 1.5 pi) (+ (* d 0.5) 100))
          px4 (polar px (* 0.5 pi) (+ (* d 0.5) 100)))
    (entmake (list '(0 . "LINE") (cons 10 px1) (cons 11 px2)(cons 8 "DOTE-ZH")))
    (entmake (list '(0 . "LINE") (cons 10 px3) (cons 11 px4)(cons 8 "DOTE-ZH")))
    (entmake (list '(0 . "CIRCLE") (cons 10 px) (cons 40 (* d 0.5))(cons 8 "ILE"))))
(setq p1 p0)
(HZX p1)
;;画承台
(setq pt1 (polar p1 (* 1.25 pi) (/ (+ d bj) (sin (* 0.25 pi))))
      pt2 (polar p1 (* 1.75 pi) (/ (+ d bj) (sin (* 0.25 pi)))))
(setq pt3 (polar p1 (* 0.25 pi) (/ (+ d bj) (sin (* 0.25 pi))));;引出--PT3
      pt4 (polar p1 (* 0.75 pi) (/ (+ d bj) (sin (* 0.25 pi)))))
(entmake (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 90 4)
               (cons 10 pt1) (cons 10 pt2)(cons 10 pt3)(cons 10 pt4)(cons 70 1)(cons 8 "BASE")))
;;---------------------------------------------------这是块的终点-----------------------------------------------
(setq pc1 pt3
      pc2 (polar pt3 (* 0.25 pi) 500))
(setq pc3 (polar pc2 0 700)
      pc4 (polar pc2 (* 0.25 pi) 80))
(entmake (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 90 3)
               (cons 10 pc1) (cons 10 pc2)(cons 10 pc3)(cons 8 "TEXT-BASE")))
(entmake (list (cons 0 "TEXT")(cons 100 "AcDbText")(cons 1 "CT2")(cons 10 pc4)
               (cons 40 300)(cons 7 "TSSD_Rein")(cons 8 "TEXT-BASE")(cons 41 0.7)))
)

;;(函数二)-----------------------------------------两桩承台--------------------------------------------
(defun c:2z (/ d n bj p0 p01 p02 p03 p04 px p1 p2 pt1 pt2 pt3 pt4 pc1 pc2 pc3 pc4)
(if (=(tblobjname "LAYER" "DOTE-BASE") nil)
        (progn
        (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") '(70 . 0) '(6 . "DOTE")
   (cons 2 "DOTE-BASE")(cons 62 244)(cons 290 0)))))
(if (=(tblobjname "LAYER" "DOTE-ZH") nil)
        (progn
        (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") '(70 . 0) '(6 . "DOTE")
   (cons 2 "DOTE-ZH")(cons 62 8)))))
(if (=(tblobjname "LAYER" "ILE") nil)
        (progn
        (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") '(70 . 0) '(6 . "DASHED")
   (cons 2 "ILE")(cons 62 6)))))
(if (=(tblobjname "LAYER" "BASE") nil)
        (progn
        (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") '(70 . 0) '(6 . "CONTINUOUS")
   (cons 2 "BASE")(cons 62 7)))))
(if (=(tblobjname "LAYER" "TEXT-BASE") nil)
        (progn
        (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") '(70 . 0) '(6 . "CONTINUOUS")
   (cons 2 "TEXT-BASE")(cons 62 7)))))
(if (=(tblobjname "STYLE" "TSSD_Rein") nil)
        (progn
        (entmake (list '(0 . "STYLE") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbTextStyleTableRecord") '(2 . "TSSD_Rein")
                       '(70 . 0) '(40 . 0) '(41 . 0) '(3 . "tssdeng.shx") '(4 . "hztxt.shx")))))
(setq d 500    ;;d--桩径
      n 3      ;;n--桩距为n倍桩径
      bj 0)    ;;bj--(d+bj)为桩心到承台边的距离,即当bj=0时,桩心到承台边的距离是d
(setq zj (* n d))
(setq p0 (getpoint "指定插入点"))
;;画承台中心--------------------------------------------这是块的起点---------------------------------------------------------
(setq p01 (polar p0 pi 250)
      p02 (polar p0 0 250)
      p03 (polar p0 (* 1.5 pi) 250)
      p04 (polar p0 (* 0.5 pi) 250))
(entmake (list '(0 . "LINE") (cons 10 p01) (cons 11 p02)(cons 8 "DOTE-BASE")))
(entmake (list '(0 . "LINE") (cons 10 p03) (cons 11 p04)(cons 8 "DOTE-BASE")))
;;画桩和桩中心
  (defun HZX(px / px1 px2 px3 px4)
    (setq px1 (polar px pi (+ (* d 0.5) 100))
          px2 (polar px 0 (+ (* d 0.5) 100))
          px3 (polar px (* 1.5 pi) (+ (* d 0.5) 100))
          px4 (polar px (* 0.5 pi) (+ (* d 0.5) 100)))
    (entmake (list '(0 . "LINE") (cons 10 px1) (cons 11 px2)(cons 8 "DOTE-ZH")))
    (entmake (list '(0 . "LINE") (cons 10 px3) (cons 11 px4)(cons 8 "DOTE-ZH")))
    (entmake (list '(0 . "CIRCLE") (cons 10 px) (cons 40 (* d 0.5))(cons 8 "ILE"))))
(setq p1 (polar p0 (* 1.5 pi) (* 0.5 zj))
      p2 (polar p0 (* 0.5 pi) (* 0.5 zj)))
(HZX p1)
(HZX p2)
;;画承台
(setq pt1 (polar p1 (* 1.25 pi) (/ (+ d bj) (sin (* 0.25 pi))))
      pt2 (polar p1 (* 1.75 pi) (/ (+ d bj) (sin (* 0.25 pi)))))
(setq pt3 (polar p2 (* 0.25 pi) (/ (+ d bj) (sin (* 0.25 pi))));;引出--PT3
      pt4 (polar p2 (* 0.75 pi) (/ (+ d bj) (sin (* 0.25 pi)))))
(entmake (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 90 4)
               (cons 10 pt1) (cons 10 pt2)(cons 10 pt3)(cons 10 pt4)(cons 70 1)(cons 8 "BASE")))

;;--------------------------------------------------这是块的终点----------------------------------------------
(setq pc1 pt3
      pc2 (polar pt3 (* 0.25 pi) 500))
(setq pc3 (polar pc2 0 700)
      pc4 (polar pc2 (* 0.25 pi) 80))
(entmake (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 90 3)
               (cons 10 pc1) (cons 10 pc2)(cons 10 pc3)(cons 8 "TEXT-BASE")))
(entmake (list (cons 0 "TEXT")(cons 100 "AcDbText")(cons 1 "CT2")(cons 10 pc4)
               (cons 40 300)(cons 7 "TSSD_Rein")(cons 8 "TEXT-BASE")(cons 41 0.7)))
)

发表于 2013-12-20 19:29:16 来自手机 | 显示全部楼层
我觉得可以考虑合并程序,这样可以共用变量,主函数将变量设置为局部变量,而主函数内的子函数将变量设置成全局变量,称为内部全局变量。
另一种方式是变量值写入词典,简单可操作,写入注册表,写入文件,等等。。
entmake生成的可以(entlast)添加到选择集,也可以用entmakex生成返回图元名加入选择集。
发表于 2013-12-20 23:20:30 | 显示全部楼层
本帖最后由 llsheng_73 于 2013-12-20 23:39 编辑

把建图层这部分给你简化一下吧,别的基本可以参考沙发上的兄弟说的

(Defun STBNAMES(TAB / snl sll)
  (SetQ snl '()sll (TblNext TAB T))
  (While (SetQ snl (Cons (Cdr (Assoc 2 sll)) snl)sll (TblNext TAB nil)))
  (vl-sort snl '<))
(defun SETLAYER(LAY CLR LTYPE F);F非打印标志,为真时不可打印
  (entmake (list'(0 . "LAYER")'(100 . "AcDbSymbolTableRecord")'(100 . "AcDbLayerTableRecord")
             '(70 . 0)(cons 6 LTYPE)(cons 2 LAY)(cons 62 CLR)(cons 290(if F 0 1)))))

(foreach x (setq lys(STBNAMES"LAYER")
      ly'(("DOTE-BASE"244"DOTE"t)("DOTE-ZH"8"DOTE"nil)("PILE"6"DASHED"nil)
   ("BASE"7"CONTINUOUS"nil)("TEXT-BASE"7"CONTINUOUS"nil)))
  (if(null(member(car x)lys))(eval(cons'SETLAYER x))))

或者
(mapcar'(lambda(x)(if(null(member(car x)lys))(eval(cons'SETLAYER x))))
   (setq lys(STBNAMES"LAYER")
  ly'(("DOTE-BASE"244"DOTE"t)("DOTE-ZH"8"DOTE"nil)("PILE"6"DASHED"nil)
      ("BASE"7"CONTINUOUS"nil)("TEXT-BASE"7"CONTINUOUS"nil))))

自己照样把别的要建立的图层定义数据加到ly表里边
批量建立图层要定义其线型的话得保证所用的线型存在,不然与之相关的图层会失败

评分

参与人数 1明经币 +1 收起 理由
edata + 1 很给力!

查看全部评分

 楼主| 发表于 2013-12-24 16:44:46 | 显示全部楼层
本帖最后由 ou_y_x 于 2013-12-24 16:54 编辑
llsheng_73 发表于 2013-12-20 23:20
把建图层这部分给你简化一下吧,别的基本可以参考沙发上的兄弟说的

(Defun STBNAMES(TAB / snl sll)

多谢。
我得先研究一下几个没用过的函数。
 楼主| 发表于 2013-12-24 16:50:54 | 显示全部楼层
edata 发表于 2013-12-20 19:29
我觉得可以考虑合并程序,这样可以共用变量,主函数将变量设置为局部变量,而主函数内的子函数将变量设置成 ...

我还是太菜了,很多函数不知道用法,也不知道该在什么情况看下用哪个函数。
身边的同事都在埋头画图,没人接触vlisp这方面。

我现在基本上是,看看别人的程序,有不认识的函数就看明经的函数参考。
但印象不够深刻,理解也很浅。
大佬能否推荐一些学习方法?
发表于 2013-12-24 17:08:41 | 显示全部楼层
ou_y_x 发表于 2013-12-24 16:50
我还是太菜了,很多函数不知道用法,也不知道该在什么情况看下用哪个函数。
身边的同事都在埋头画 ...

多看,多想,多问,多写。
发表于 2013-12-24 17:58:41 | 显示全部楼层
ou_y_x 发表于 2013-12-24 16:50
我还是太菜了,很多函数不知道用法,也不知道该在什么情况看下用哪个函数。
身边的同事都在埋头画 ...

;;主函数集合
(defun sk_tt(sk_mode / a b c)
  (setq a 100 b 300 c 400)
  (defun sk_+();内部函数先要写出来
    (+ a b c)
    )
  (defun sk_*();内部函数先要写出来
    (* a b c)
    )
  ;判断执行
  (cond
    ((= sk_mode 1)(princ(sk_+)))
    ((= sk_mode 2)(princ(sk_*)))
    )
  )
;;命令写法
(defun c:tt1()(sk_tt 1)(princ))
(defun c:tt2()(sk_tt 2)(princ))
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-26 01:03 , Processed in 0.192105 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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