明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: wowan1314

[讨论] 【思路求助】有趣的对话框程序!LISP能实现吗?

[复制链接]
发表于 2013-5-4 14:40:54 | 显示全部楼层
wowan1314 发表于 2013-5-4 13:59
DCL可以记忆上次位置,却不知道怎么根据鼠标位置改动?!

能否具体说明下? 最好能举个例子。谢谢

G版说的,是不是可以类似这个http://bbs.mjtd.com/forum.php?mod=viewthread&tid=95767

点评

类似。不过需要再精细下!  发表于 2013-5-4 15:18
发表于 2013-5-4 21:33:49 | 显示全部楼层
强悍的工具箱啊,结构工程师的福音
发表于 2013-5-5 10:16:38 | 显示全部楼层
长见识了   
发表于 2013-5-9 16:54:45 | 显示全部楼层
本帖最后由 x_s_s_1 于 2013-5-12 19:17 编辑

楼下程序的编制思路,慢慢添加
1、首先对话框要绘制在视口中,对话框的大小就需要考量,在视口中绘制的是矢量,要达到像素的效果,就要进行换算,如何换算呢?用了这句(setq v-s-sc (/ (getvar "viewsize") (cadr (getvar "screensize"))))。
2、对话框要与鼠标位置有固定的关系,那么对话框的初始插入点就要根据鼠标位置进行调整,本程序是对话框左上角点即为鼠标位置,用了这句(setq gr (grread t 15 1))(setq pt (cadr gr)),实际上本程序现阶段有个问题还没有解决,当鼠标点靠近窗口边的时候,绘制的对话框不能到屏幕外面去,这里要加个判断进行调整,该部分有时间再修改。
(先说到这里20130512 19:17)
发表于 2013-5-12 18:46:38 | 显示全部楼层
本帖最后由 x_s_s_1 于 2013-5-12 18:53 编辑

水平有限,按照古版的思路写了一个,有几个地方处理的有问题,1、变色部分写的混乱;2、当左键选择对话框外退出这部分写的不好;3、图层前置部分不想用command,问了好多人也没有好办法;4、整个程序的思路不是很顺畅5、多个对话框部分,在想着如何精简代码,比较忙,没有写注释,请见谅。有空再论。请大家加上容错函数和undo,希望高手们拍砖,且提出更好的代码,谢谢。
  1. (defun get_dxf (ent n /)
  2.   (if (eq (type ent) 'ename)
  3.     (setq ent (entget ent))
  4.   )
  5.   (cdr (assoc n ent))
  6. )
  7. (defun X_SS->List (ss vla / i lst)
  8.   (if (eq (type ss) 'PICKSET)
  9.     (if  vla
  10.       (repeat (setq i (sslength ss))
  11.   (setq
  12.     lst
  13.      (cons (vlax-ename->vla-object (ssname ss (setq i (1- i))))
  14.      lst
  15.      )
  16.   )
  17.       )
  18.       (repeat (setq i (sslength ss))
  19.   (setq lst (cons (ssname ss (setq i (1- i))) lst))
  20.       )
  21.     )
  22.     (princ "您输入的ss不是选择集")
  23.   )
  24. )
  25. (defun ch_dxf_ss (ss num ch / ssl en ent new_num old_num x y)
  26.   (cond
  27.     ((eq (type ss) 'PICKSET) (setq ssl (X_SS->List ss nil)))
  28.     ((eq (type ss) 'ENAME) (setq ssl (list ss)))
  29.     ((eq (type ss) 'VLA-OBJECT)
  30.      (setq ssl (list (vlax-vla-object->ename ss)))
  31.     )
  32.   )
  33.   (cond
  34.     ((eq (type num) 'INT) (setq num (list num)))
  35.   )
  36.   (cond
  37.     ((null (eq (type ch) 'LIST)) (setq ch (list ch)))
  38.   )
  39.   (if (/= (length num) (length ch))
  40.     (princ "组码表与修改表数目不等")
  41.     (foreach en  ssl
  42.       (mapcar '(lambda (x y)
  43.      (setq ent     (entget en)
  44.            new_num (cons x y)
  45.            old_num (assoc x ent)
  46.      )
  47.      (if old_num
  48.        (entmod (subst new_num old_num ent))
  49.        (entmod (reverse (cons new_num (reverse ent))))
  50.      )
  51.          )
  52.         num
  53.         ch
  54.       )
  55.     )
  56.   )
  57.   ss
  58. )
  59. ;; entmakex-hatch By ElpanovEvgeniy
  60. ;; L - list of list point. like ((pt11 pt12 pt13)(pt21 pt22 pt23))
  61. ;; A - angle hatch
  62. ;; N - name pattern
  63. ;; S - scale
  64. ;; returne - hatch ename
  65. (defun entmakex-hatch (L a n s)
  66.   (entmakex
  67.     (apply
  68.       'append
  69.       (list
  70.   (list '(0 . "HATCH")
  71.         '(100 . "AcDbEntity")
  72.         '(410 . "Model")
  73.         '(100 . "AcDbHatch")
  74.         '(10 0.0 0.0 0.0)
  75.         '(210 0.0 0.0 1.0)
  76.         (cons 2 n)
  77.         (if (= n "SOLID")
  78.     '(70 . 1)
  79.     '(70 . 0)
  80.         )
  81.         '(71 . 0)
  82.         (cons 91 (length l))
  83.   )
  84.   (apply
  85.     'append
  86.     (mapcar '(lambda (a)
  87.          (apply 'append
  88.           (list (list  '(92 . 7)
  89.           '(72 . 0)
  90.           '(73 . 1)
  91.           (cons 93 (length a))
  92.           )
  93.           (mapcar '(lambda (b) (cons 10 b)) a)
  94.           '((97 . 0))
  95.           )
  96.          )
  97.        )
  98.       l
  99.     )
  100.   )
  101.   (if (= n "SOLID")
  102.     (list  '(75 . 0)
  103.     '(76 . 1)
  104.     '(47 . 1.)
  105.     '(98 . 2)
  106.     '(10 0. 0. 0.0)
  107.     '(10 0. 0. 0.0)
  108.     '(450 . 0)
  109.     '(451 . 0)
  110.     '(460 . 0.0)
  111.     '(461 . 0.0)
  112.     '(452 . 0)
  113.     '(462 . 0.0)
  114.     '(453 . 2)
  115.     '(463 . 0.0)
  116.     '(63 . 256)
  117.     '(463 . 1.0)
  118.     '(63 . 256)
  119.     '(470
  120.       .
  121.       "LINEAR"
  122.      )
  123.     )
  124.     (list  '(75 . 0)
  125.     '(76 . 1)
  126.     (cons 52 a)
  127.     (cons 41 s)
  128.     '(77 . 0)
  129.     '(78 . 1)
  130.     (cons 53 a)
  131.     '(43 . 0.)
  132.     '(44 . 0.)
  133.     '(45 . 1.)
  134.     '(46 . 1.)
  135.     '(79 . 0)
  136.     '(47 . 1.)
  137.     '(98 . 2)
  138.     '(10 0. 0. 0.0)
  139.     '(10 0. 0. 0.0)
  140.     '(470 . "LINEAR")
  141.     )
  142.   )
  143.       )
  144.     )
  145.   )
  146. )
  147. (defun pick_lst  (pt w h mid /)
  148.   (if mid
  149.     (list (mapcar '- pt (list (/ w 2) (/ h 2)))
  150.     (mapcar '+ pt (list (/ w 2) (- (/ h 2))))
  151.     (mapcar '+ pt (list (/ w 2) (/ h 2)))
  152.     (mapcar '+ pt (list (- (/ w 2)) (/ h 2)))
  153.     )
  154.     (list pt
  155.     (polar pt 0 w)
  156.     (mapcar '+ pt (list w h))
  157.     (polar pt (/ pi 2) h)
  158.     )
  159.   )
  160. )
  161. (defun c:tt
  162.       (/ lay gr v-s-sc pt  b_pl b_hatch b_txt en loop mouse_pic ss
  163.        b ent oi)
  164.   (if (null (tblobjname "LAYER" "my_对话框"))
  165.     (setq lay (entmakex  (list
  166.         '(0 . "LAYER")
  167.         '(100
  168.           .
  169.           "AcDbSymbolTableRecord"
  170.          )
  171.         '(100
  172.           .
  173.           "AcDbLayerTableRecord"
  174.          )
  175.         '(6 . "continuous")
  176.         '(62 . 7)
  177.         '(70 . 0)
  178.         '(2 . "my_对话框")
  179.       )
  180.         )
  181.     )
  182.   )
  183.   (setq gr (grread t 15 1))
  184.   (setq v-s-sc (/ (getvar "viewsize") (cadr (getvar "screensize"))))
  185.   (setq pt (cadr gr))
  186.   (setq
  187.     mouse_pic (entmakex
  188.     (list '(0 . "LWPOLYLINE")
  189.           '(100 . "AcDbEntity")
  190.           '(100 . "AcDbPolyline")
  191.           '(90 . 3)
  192.           '(70 . 0)
  193.           (cons 10 pt)
  194.           '(40 . 0.0)
  195.           (cons 41 (* (* 10 v-s-sc)))
  196.           '(42 . 0.0)
  197.           (cons 10 (polar pt (* 1.75 pi) (* 12.5 v-s-sc)))
  198.           (cons 40 (* (* 3 v-s-sc)))
  199.           (cons 41 (* (* 7.5 v-s-sc)))
  200.           '(42 . 0.194617)
  201.           (cons 10 (polar pt (* 1.85 pi) (* 27.5 v-s-sc)))
  202.           (cons 40 (* (* 7.5 v-s-sc)))
  203.           (cons 41 (* (* 7.5 v-s-sc)))
  204.           '(42 . -0.309442)
  205.     )
  206.         )
  207.   )
  208.   (ch_dxf_ss mouse_pic '(8 62) '("my_对话框" 1))
  209.   (setq  b_pl
  210.    (entmakex
  211.      (append
  212.        (list
  213.          '(0 . "LWPOLYLINE")
  214.          '(100 . "AcDbEntity")
  215.          '(100 . "AcDbPolyline")
  216.          '(90 . 4)
  217.          '(70 . 1)
  218.          (cons 43 (* 3 v-s-sc))
  219.        )
  220.        (mapcar '(lambda (x) (cons 10 x))
  221.          (pick_lst pt (* 100 v-s-sc) (* 50 v-s-sc) nil)
  222.        )
  223.      )
  224.    )
  225.   )
  226.   (ch_dxf_ss b_pl '(8 62) '("my_对话框" 90))
  227.   (setq  b_hatch  (ENTMAKEX-HATCH
  228.       (list  (mapcar  'cdr
  229.         (vl-remove-if-not
  230.           '(lambda (x) (= 10 (car x)))
  231.           (entget b_pl)
  232.         )
  233.       )
  234.       )
  235.       0
  236.       "solid"
  237.       1
  238.     )
  239.   )
  240.   (ch_dxf_ss b_hatch '(8 62) '("my_对话框" 8))
  241.   (setq  b_txt (entmakex  (list '(0 . "text")
  242.             (cons 10 pt)
  243.             (cons 1 "画圈圈")
  244.             (cons 40 (* 30 v-s-sc))
  245.             '(41 . 0.8)
  246.             '(7 . "standard")
  247.       )
  248.         )
  249.   )
  250.   (ch_dxf_ss
  251.     b_txt
  252.     '(8 62 72 73 11)
  253.     (list "my_对话框"
  254.     6
  255.     4
  256.     0
  257.     (polar (polar pt 0 (* 50 v-s-sc)) (/ pi 2) (* 25 v-s-sc))
  258.     )
  259.   )
  260.   (command "_.DRAWORDER" b_hatch "" "f")
  261.   (command "_.DRAWORDER" b_pl "" "f")
  262.   (command "_.DRAWORDER" b_txt "" "f")
  263.   (command "_.DRAWORDER" mouse_pic "" "f")
  264.   (setq loop t)
  265.   (while loop
  266.     (setq gr (grread t 15 1))
  267.     (cond
  268.       ((= 5 (car gr))
  269.        (setq
  270.    v-s-sc  (/ (getvar "viewsize") (cadr (getvar "screensize")))
  271.        )
  272.        (setq pt (cadr gr))
  273.        (setq en  (reverse (vl-member-if
  274.          (function (lambda (x) (= 39 (car x))))
  275.          (reverse (entget mouse_pic))
  276.        )
  277.     )
  278.        )
  279.        (entmod
  280.    (append en
  281.      (list (cons 10 pt)
  282.            '(40 . 0.0)
  283.            (cons 41 (* (* 10 v-s-sc)))
  284.            '(42 . 0.0)
  285.            (cons 10 (polar pt (* 1.75 pi) (* 12.5 v-s-sc)))
  286.            (cons 40 (* (* 3 v-s-sc)))
  287.            (cons 41 (* (* 7.5 v-s-sc)))
  288.            '(42 . 0.194617)
  289.            (cons 10 (polar pt (* 1.85 pi) (* 27.5 v-s-sc)))
  290.            (cons 40 (* (* 7.5 v-s-sc)))
  291.            (cons 41 (* (* 7.5 v-s-sc)))
  292.            '(42 . -0.309442)
  293.      )
  294.    )
  295.        )
  296.        (setq b (getvar "pickbox"))
  297.        (if (setq ss (ssget "cp"
  298.          (pick_lst pt (* v-s-sc b) (* v-s-sc b) t)
  299.          '((0 . "TEXT") (8 . "my_对话框"))
  300.         )
  301.      )
  302.    (progn
  303.      (setq ent (car (X_SS->List ss nil)))
  304.      (if (and (= "TEXT" (get_dxf ent 0))
  305.         (= "my_对话框" (get_dxf ent 8))
  306.          )
  307.        (ch_dxf_ss ent 62 2)
  308.      )
  309.    )
  310.    (progn (ch_dxf_ss ent 62 6) (setq ent nil))
  311.           ;这里个人感觉不顺畅
  312.        )
  313.       )
  314.       ((= (car gr) 3)
  315.        (if ent
  316.    (setq oi (get_dxf ent 1))
  317.        )
  318.        (entdel b_hatch)
  319.        (entdel b_txt)
  320.        (entdel b_pl)
  321.        (entdel mouse_pic)
  322.        (cond ((= oi "画圈圈")
  323.         (entmake (list '(0 . "circle")
  324.            (cons 10 (getpoint "\n选择圆心:"))
  325.            (cons 40 (getreal "\n输入半径:"))
  326.            )
  327.         )
  328.        )
  329.        )
  330.        (setq loop nil)
  331.       )
  332.     )
  333.   )
  334.   (vla-delete (vlax-ename->vla-object lay))
  335.   (princ)
  336. )

本帖子中包含更多资源

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

x
 楼主| 发表于 2013-5-12 19:14:07 | 显示全部楼层
x_s_s_1 发表于 2013-5-12 18:46
水平有限,按照古版的思路写了一个,有几个地方处理的有问题,1、变色部分写的混乱;2、当左键选择对话框外 ...

不错哦!最近没时间搞!不过想象了下!还是用wipeout作底,solid作为选中文字的底!所有点应该计算完后再按顺序生成各个部件!避免重新生成影响速度!还有格子出现的位置不能超出屏幕否则重新计算!

点评

用大字体的话,重生成的速度还是可以的,毕竟图元不多,最后一个问题我也考虑了,在14楼有论述,也是没时间,有时间再调整吧,多交流  发表于 2013-5-12 19:20
发表于 2013-5-13 09:59:45 | 显示全部楼层
这软件太霸气了。。。。 擦。。。。。。
发表于 2013-6-12 00:07:04 | 显示全部楼层
这就是lisp的境界。。。
发表于 2014-4-3 09:52:01 | 显示全部楼层
太牛逼了,要是能有这个就好了
发表于 2015-10-27 14:57:15 | 显示全部楼层
太牛逼了,要是能有这个就好了!!!

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

本版积分规则

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

GMT+8, 2024-11-14 21:16 , Processed in 0.240425 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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