明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: fawn_lgc

lisp如何实现实时动态显示

  [复制链接]
 楼主| 发表于 2002-11-6 17:21:00 | 显示全部楼层

alin的程序很好,但如不是圆而是自定义图形,好像就不灵了,以"矩形程序"为例

本帖最后由 作者 于 2002-11-6 17:21:36 编辑

alin提供的程序很好,但如果不是圆,而是绘制自定义的图形,好像就不行了.
以这个"画矩形程序"为例,又该如何实现实时拖动呢.希望大师再指点一下.

;;;画矩形程序

(defun c:rect (/ cmdsave ossave x y x1 y1 pt pt1 pt2 pt3 pt4)
  (defun *error*(msg)
    (if (and (/= msg "Function cancelled")(/= msg "函数被取消"))
      (princ(strcat "错误:" msg "\n"))
      )
    (setvar "cmdecho" cmdsave)
    (princ)
    )
  (setq cmdsave (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (setq pt (getpoint "矩形中心:"))
  (if (/= pt nil)
    (progn
      (setq pt1 (getpoint pt "\n角点:"))
      (if (/= pt1 nil)
        (progn
          (setq ossave (getvar "osmode"))
          (setvar "osmode" 0)
          (setq x (car pt) y (nth 1 pt))   
          (setq x1 (car pt1) y1 (nth 1 pt1))
          (setq pt2 (list x1 (- (* 2 y) y1)))
          (setq pt4 (list(- (* 2 x) x1) y1))
          (setq pt3 (list (- (* 2 x) x1)(- (* 2 y) y1)))
          (vl-cmdf "pline" pt1 pt2 pt3 pt4 "c")
          (vl-cmdf "line" pt1 pt3 "")
          (vl-cmdf "line" pt2 pt4 "")
          (setvar "osmode" ossave)
          )
        )
      )
    )
  (setvar "cmdecho" cmdsave)
  (princ)
  )

[move]小鹿[/move]

 楼主| 发表于 2002-11-6 15:40:00 | 显示全部楼层

绘制"角铁"的程序

本帖最后由 作者 于 2002-11-6 15:40:35 编辑

我编写的绘制"角铁"的程序,我一直在用,程序中有什么不足之出希望各位大虾指正

本帖子中包含更多资源

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

x
发表于 2002-11-6 16:38:00 | 显示全部楼层

如果能够编写一个对话框,实现型号、壁厚、角度等参数的交互式输入就更好了

发表于 2002-11-6 16:47:00 | 显示全部楼层

用下面的方法可实现最后的动态旋转

将源程序中的

“。。。。
(setq ang (getangle pt  "\n旋转角度<0>:"))
      (if (not ang)(setq ang 0)(setq ang (angtos ang 0 15)))
      (command "rotate" "last" "" pt ang)
。。。。。”
改为
;(setq ang (getangle pt  "\n旋转角度<0>:"))
      ;(if (not ang)(setq ang 0)(setq ang (angtos ang 0 15)))
(princ "\n 旋转角度<0>:")
      (command "rotate" "last" "" pt pause)
这样就可以了。
发表于 2002-11-6 16:48:00 | 显示全部楼层

动态显示中线的长度

(defun C:ZXX (/        ST1 ST2        PT1 PT2        STR1 STR2 END1 END2 ZHOD ANG1 JANG ST
              STR3 PT3 ZDP ANG2        ANG3 DIS1 DIS2 XXXX YYYY HOLDORTH
              HOLDANG
             )
  (defun DO_IT ()
    (command "_xline" "a" (/ (* JANG 180) pi) ZHOD "")
    (HDISP (car ST1) 4)
    (HDISP (car ST2) 4)
    (setq ST (ssget "l"))
    (HDISP (ssname ST 0) 3)
    (setq STR3 (getpoint "\n 请输入中线的起点: "))
    (command "snapang" (/ (* JANG 180) pi))
    (DIST JANG ZHOD STR3)
    (setq STR3 PT3)
    (prompt "\n 请输入中线的终点: ")
    (setvar "orthomode" 1)
    (command "erase" ST "")
    (command "line" STR3 PAUSE "")
  )
  (setq HOLDORTH (getvar "orthomode"))
  (setq HOLDANG (/ (* (getvar "snapang") 180) pi))
  (setq ST1 (entsel "\n 请选择第一条直线: "))
  (HDISP (car ST1) 3)
  (while (/= (cdr (assoc 0 (entget (car ST1)))) "LINE")
    (HDISP (car ST1) 4)
    (setq ST1 (entsel "\n 请选择第一条直线: "))
    (HDISP (car ST1) 3)
  )
  (setq ST2 (entsel "\n 请选择第二条直线: "))
  (HDISP (car ST2) 3)
  (while (/= (cdr (assoc 0 (entget (car ST2)))) "LINE")
    (HDISP (car ST2) 4)
    (setq ST2 (entsel "\n 请选择第二条直线: "))
    (HDISP (car ST2) 3)
  )
  (setq        PT1  (last ST1)
        PT2  (last ST2)
        STR1 (cdr (assoc 10 (entget (car ST1))))
        END1 (cdr (assoc 11 (entget (car ST1))))
        STR2 (cdr (assoc 10 (entget (car ST2))))
        END2 (cdr (assoc 11 (entget (car ST2))))
        ZHOD (inters STR1 END1 STR2 END2 NIL)
  )
  (if (= ZHOD NIL)
    (progn
      (setq ANG1 (angle STR1 STR2)
            DIS1 (distance STR1 STR2)
            ZHOD (polar STR1 ANG1 (/ DIS1 2.0))
            JANG (angle STR1 END1)
      )
      (DO_IT)
    )
    (progn
      (JD PT1 STR1 ZHOD END1)
      (setq ANG1 ANG)
      (JD PT2 STR2 ZHOD END2)
      (setq ANG2 ANG)
      (setq JANG (/ (+ ANG1 ANG2) 2.0))
      (DO_IT)
    )
  )
  (setvar "orthomode" HOLDORTH)
  (setvar "snapang" HOLDANG)
)

(defun DIST (ANG1 PT1 POT)
  (setq        ANG2 (angle PT1 POT)
        ANG3 (- ANG2 ANG1)
        DIS1 (distance PT1 POT)
        DIS2 (* (cos ANG3) DIS1)
        PT3  (polar PT1 ANG1 DIS2)
  )
)
(defun JD (PT1 STR1 JIAOD ENDP)
  (setq        XXXX (* (- (car PT1) (car STR1)) (- (car PT1) (car JIAOD)))
        YYYY (* (- (cadr PT1) (cadr STR1)) (- (cadr PT1) (cadr JIAOD)))
  )
  (if (or (< XXXX 0) (< YYYY 0))
    (setq ANG (angle ENDP STR1))
    (setq ANG (angle STR1 ENDP))
  )
)
(defun HDISP (HS HC)
  (redraw HS HC)
)
发表于 2002-11-6 21:53:00 | 显示全部楼层

用LISP太费神了。我建议用VBA或VB来做

本帖最后由 作者 于 2002-11-6 21:53:56 编辑

我用LISP编制型钢绘制程序,包括角钢,槽钢,工字钢等等常用的型钢用了近一个月的时间,而用VBA只用三天就搞定了!而且还可以把数据库用在上面,便于维护更新管理!

[此贴子已经被作者于2002-11-6 21:52:29编辑过]
发表于 2002-11-7 06:35:00 | 显示全部楼层

It is possible, use (Grread) again!

1. Pick the center point.
2. Trace the cursor with (Grread).
3. if the current location of the cursor is away from last point,
   say, 0.01 units, insert the block pre-made.
4. Keep tracing the cursor, if no left-click, keep updating the   block inerted.
5. If left-click happens, get the last location of cursor, then update the block or delete the block then draw up what you want.
发表于 2002-11-7 07:40:00 | 显示全部楼层

谢谢您龙大侠!

您是通过设定当前视口捕捉和栅格的旋转角这个系统参数来限制绘制中线的角度对么?
我试过了,非常好用,同时也解决了输入终点或长度不能同时进行的问题。
还有一个问题,如果要绘制对称线,可以同时动态显示两条直线么?
发表于 2002-11-7 07:57:00 | 显示全部楼层

用mline应该可以只是参考点会不一样!!!

发表于 2002-11-7 14:20:00 | 显示全部楼层

把多线的对中方式设为对中,把对称线的宽度设为多线的缩放比例,参考点就在选定的直

把多线的对中方式设为对中,把对称线的宽度设为多线的缩放比例,参考点就在选定的直线上,对么?[br]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-23 12:01 , Processed in 0.274951 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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