模具论坛

 找回密码
 注册

扫一扫,微信登录

QQ登录

只需一步,快速开始

搜索
热搜: 冲压 注塑 求助
    回车查看更多
    论坛可能已存在您要发布的主题帖 关闭
      查看: 960|回复: 4

      自动绘制出中心线[转帖]

      [复制链接]
      发表于 2003-1-13 00:32:00 | 显示全部楼层 |阅读模式
      AutoCAD是目前国内应用最广范的CAD系统之一,AutoCAD 功能强大,是一个通用的CAD平台,但是如果不根据本专业的需要进行二次开发,使用起来是很不方便的。画对称中心线是机械设计中经常遇到的一个问题。    

      笔者用AutoLISP依据国家标准开发了两个程序,可以很方便地解决直线对称中心线的问题。

        第一个程序适用于两条边是连续直线的情况。使用方法是:用LOAD命令装入GLS.LSP,运行C:GSL,依据屏幕提示,分别选择两边, 自动绘制出中心线。

      GSL.LSP:

      (defun mid(pt1 pt2 ) 计算两点之中点的功能函数

      (setq pt (mapcar'+pt1 pt2 ))

      (setq pt (mapcar'/pt'(2 2 2)))

      )

      (defun c:gsl/m cl1 cl cl2 e pt pt1 pt2 pt3 pt4 a)  (SETQ M 1)

       (WHILE M

        (SETQ CL1 (ENTSEL"\n选择第一条直线 "))

        (cond

         ((not cl1 )  (prompt"\n 没有发现实体"))

         ((/="LINE"(cdr (assoc 0 (setqe(entget (car cl1))))))

      (prompt"\n 所选不是直线")

        )

        (t (prompt"找到了第一条直线”)

         (setq m nil);退出循环

        )

        )

      )

      (setq cl (ssget (nth 0 (cdr cl1))));取得第一条直线的实体数据

      (SETQ M 1)

      (WHILE M

       (SETQ CL2 (ENTSEL"\n选择第二条直线"))

       (if cl2

        (if (ssmemb (car cl2) cl )

          (progn

           (princ"\n选择重复,重新选择")

           (setq cl2 nil)

          )

        )

       )

       (cond

        ((not cl2 ) (prompt"没有发现实体或重复"))

        ((/="LINE"(cdr (assoc 0 (setq e (entget (car cl2))))))

           (prompt"\n 所选不是直线")

        )

        (t (prompt"\n两条直线已经选择完毕")

         (setq m nil);;;退出循环

        )

        )

       )

      ;;;取得第一直线两端点的坐标

       (setq pt1 (cdr (assoc 10 e )) pt2 (cdr (assoc 11 e )))

       (setq e (entget (car cl1)));;取得第二条直线的实体数据

      ;;;取得第二直线两端点的坐标

       (setq pt3 (cdr (assoc 10 e )) pt4 (cdr (assoc 11 e )))

      ;;调整端点  

       (if (inters pt1 pt3 pt2 pt4 t)

         (setq pt pt1

           pt1 pt2

           pt2 pt

        )

       )

      ;;;计算两端中点坐标

       (setq pt1 (mid pt1 pt3 ))

       (setq pt2 (mid pt2 pt4 ))

       (setq a (angle pt1 pt2));计算中心线的倾角

       (setq pt2 (polar pt2 a 2.5));;计算中心线的第一个端点

       (setq pt1 (polar pt1 (+pi a ) 2.5))

       (command"layer""SET"5"");;设置中心线层

       (command "line" pt1 pt2 "");;画出中心线

      )

      (princ "\nC:GSL has loaded")

      (Princ "\n for symmetry line")

      (princ)

        第二个程序适用于阶梯轴,阶梯孔等各种情况。使用方法是:用LOAD命令装入GLS1.LSP,运行C:GSL1,依据屏幕提示,分别选择两边的端点, 自动绘制出中心线。

      GSL1.LSP

      (defun mid(pt1 pt2 )

        (setq pt (mapcar '+ pt1 pt2 ))

        (setq pt (mapcar '/ pt '(2 2 2)))

      )

      (defun c:gsl1(/ p1 p1 p3 p4 a )

       ;;保存环境变量

       (setq os (getvar "osmode"))

       (setq cm (getvar "cmdecho"))

       ;;设置环境变量

       (setvar "osmode" 33)

       (setvar "cmdecho" 0)

       ;;依次读取两条直线的端点

       (initget 1)

       (setq p1 (getpoint"\n选择第一条直线的第一个点"))

       (initget 1)

       (setq p2 (getpoint"\n选择第一条直线的第二个点"))

       (initget 1)

       (setq p3 (getpoint"\n选择第二条直线的第一个点"))

       (initget 1)

       (setq p4 (getpoint"\n选择第二条直线的第二个点"))

       ;;;;恢复环境变量

       (setvar "osmode" os)

       (setq p1 (mid p1 p3 ))

       (setq p2 (mid p2 p4 ))

       (setq a (angle p1 p2))

       (setq p2 (polar p2 a 2.5))

       (setq p1 (polar p1 (+ pi a ) 2.5))

       (command "layer" "set" 5 "")

       (command "line" p1 p2 "")

      )

      (princ "\nC:GSL1 has loaded")

      (Princ "\n for symmetry line")

      (princ)

       楼主| 发表于 2003-1-13 00:33:00 | 显示全部楼层

      用Pline绘制齿轮

      本例程能够根据给定的直径、齿数和角度绘制齿轮轮廓线。绘成
          的轮廓是连续的polyline,能方便地进行三维延伸等处理。不过
          其中曲线生成采用的数据是根据美国机械行业标准,用的时候可
          能要根据自己的需要修改。
           
      〖安装〗
          将"程序代码"一节的文本裁剪下来,保存成名为"SUPRGEAR.LSP"的
          文本文件;将这个文件拷贝到AutoCAD的系统目录中。
      〖使用〗
          在AutoCAD命令行键入:(load "suprgear")
          然后执行:SG,按程序中的提示操作即可。

      〖程序代码〗
      ;;;begain suprgear.lsp
      ;*************************************************
      ;SPURGEAR.LSP - a lisp program by Tony Hotchkiss
      ;-------------------------------------------------
      ;  This routine draws a spur gear using joined
      ;  polylines. It lets you use any pressure angle
      ;  to design the gear teeth.
      ;*************************************************
      (defun err (s)
        (if (= s "Function cancelled")  
          (princ "\nSPURGEAR - cancelled: ")
          (progn (princ "\nSPURGEAR - Error: ") (princ s)  
          (terpri))
        ); if
        (resetting)
        (princ "SYSTEM VARIABLES have been reset\n")
        (princ)
      ); err

      (defun setv (systvar newval)
         (setq x (read (strcat systvar "1")))   
         (set x (getvar systvar))
         (setvar systvar newval)  
      ); setv  

      (defun setting ()
         (setq oerr *error*)
         (setq *error* err)
         (setv "CMDECHO" 0)   
         (setv "BLIPMODE" 0)   
      ); end of setting  
      (defun rsetv (systvar)
         (setq x (read (strcat systvar "1")))
         (setvar systvar (eval x))
      ); restv
      (defun resetting ()  
         (rsetv "CMDECHO")
         (rsetv "BLIPMODE")
         (setq *error* oerr)
      ); end of resetting  

      (defun dxf (code ename)
        (cdr (assoc code (entget ename)))
      ); dxf

      (defun spurgear (/ D N phi DO RO A B DR DB inv-plst p1
         trimcode invent p0 p curvent linent linent2 ent2 p2)
        (setq D (getreal "\nPitch diameter: ")
              N (getint "\nNumber of teeth: ")
              phi (getreal "\nPressure angle: ")
              phi (* (/ phi 180) pi)    ; Pressure angle
              DO (* D (+ (/ 2.0 N) 1.0)); Outside diameter
              RO (/ DO 2.0)              ; Outside radius
              A (/ D N)                  ; Addendum
              B (* 1.25 A)               ; Dedendum
              DR (- D (* B 2.0))         ; Root diameter
              DB (* D (cos phi))         ; Base circle dia.
              inv-plst (involute DB N phi);involute points
              trimcode nil
        ); setq
        (command "ZOOM" (list 0 (- B))
                        (list RO (/ RO 1.5))
        ); command
        (setq invent (draw-inv inv-plst)); Draw involute.
        (setq p0 (car inv-plst)
              trimcode (ext-trim p0 DR D);trim or extend
        ); setq                        ; the involute.
        (if (and trimcode (= trimcode 0))
          (progn  ; Joins the involute to the extension.
            (setq p (list (/ DR 2.0) 0))
            (command "PEDIT" p "Y" "J" invent "" "X")
            (setq curvent (entlast))
          ); progn
          (setq curvent (entlast))
        ); if
        (if (null trimcode) (setq curvent invent))
        (setq linent (draw-top-line D DB N RO)); top line.
        (command "COPY" linent "" "0,0" "0,0")
        (setq linent2 (entlast))
        (setq ent2 (mir-it curvent linent)); mirror curve
        (command "PEDIT" curvent "J" linent ent2 "" "X")
        (segment DR N linent2) ; Finish the job!
        (setq p1 (list (- RO) (- RO)))
        (setq p2 (list RO RO))
        (command "ZOOM" p1 p2)
        (prompt "\nConverting to POLYLINE, please wait...")
        (command "PEDIT" (entlast) "J" "C" p1 p2 "" "X")
        (prompt "\nAll done!")
      ); spurgear

      (defun involute (DB N phi / numer denom frac theta2max
             thetamax theta-inc theta plist RB xval yval p)
         (setq invfact 3)
         (setq numer (+ N 2.0)
               denom (* N (cos phi))
               frac (/ numer denom)
               theta2max (- (* frac frac) 1)
               thetamax (sqrt theta2max)
               theta-inc (/ thetamax (float invfact))
               theta 0
               plist nil
               RB (/ DB 2.0)
         ); setq
         (repeat (1+ invfact)
           (setq xval (do-x RB theta)
               yval (do-y RB theta)
               p (list xval yval)
               plist (append plist (list p))
           ); setq
           (setq theta (+ theta theta-inc))
         ); repeat
         plist
      ); involute

      (defun do-x (RB theta)
         (* RB (+ (cos theta) (* theta (sin theta))))
      ); do-x

      (defun do-y (RB theta)
         (* RB (- (sin theta) (* theta (cos theta))))
      ); do-y

      (defun draw-inv (inv-plst / dirpt plist p)
        (command "PLINE" (nth 0 inv-plst))
        (setq dirpt (polar (nth 0 inv-plst) 0 1))
        (command "A" "D" dirpt)
        (setq plist (cdr inv-plst))
        (foreach p plist (command p))
        (command "")
        (entlast)
      ); draw-inv

      (defun ext-trim (p0 DR D / trimcode dist endr)
        (if (> (car p0) (/ DR 2.0)) ; Extends the involute
          (progn
            (command "LINE" (list (/ DR 2.0) 0) p0 "")
            (setq trimcode 0)
          ); progn
        ); if
        (if (< (car p0) (/ DR 2.0)) ; Trims the involute
          (progn
            (command "CIRCLE" "0,0" "D" DR); Root circle
            (setq dist (- (/ D 2.0) (car p0)))
            (command "ZOOM" p0  
                       (polar p0 0.6 dist))
            (setq endr (entlast))
            (command "TRIM" endr "" p0 "")
            (command "ZOOM" "P")
            (entdel endr)
            (setq trimcode 1)
          ); progn
        ); if
        trimcode
      ); ext-trim

      (defun draw-top-line (D DB N RO / theta-p xp yp alpha
          beta tang angend inv-endpt lend)
        (setq theta-p (sqrt (- (* (/ D DB) (/ D DB)) 1.0))
              xp (do-x (/ DB 2.0) theta-p); This section
              yp (do-y (/ DB 2.0) theta-p); sets up angles
              alpha (atan yp xp)           ; for drawing a
              abeta (angle (list 0 0) (last inv-plst))
              beta (- abeta alpha)        ; line across the
              tang (/ pi N)                ; top of a tooth
              angend (- (+ alpha tang) beta)
              inv-endpt (last inv-plst); This also creates
              lend (polar (list 0 0) angend RO); the tooth
        ); setq                            ; thickness.
        (command "LINE" inv-endpt lend ""); Draws the line
        (redraw)
        (entlast)
      ); draw-top-line

      (defun mir-it (cvent linent / pt)
        (setq pt (dxf 11 linent))
        (command "MIRROR" cvent "" "MID" pt "0,0" "")
        (entlast)
      ); mir-it

      (defun segment (DR N en / p1 p2 ang dist midp p0 pang
          pang2 p p3 ent3 entl1 entl2 en1 en2)   
        (setq p1 (dxf 10 en)
              p2 (dxf 11 en)
              ang (angle p1 p2)
              dist (/ (distance p1 p2) 2.0)
              midp (polar p1 ang dist)
              p0 (list 0 0)
              pang (angle p0 midp)
              pang2 (/ pi N)
              p (polar p0 pang (/ DR 2.0))
              p1 (polar p0 (- pang pang2) (/ DR 2.0))
              p2 (polar p0 (+ pang pang2) (/ DR 2.0))
              p3 (polar p0 (+ pang pang2 pang2) (/ DR 2.0))
              ent3 (entlast); This is the tooth p-line
        ); setq
        (command "ZOOM" "W" p3 p1)
        (command "CIRCLE" "0,0" "D" DR) ;Root circle
        (command "TRIM" ent3 "" p ""); Trim the root circle
        (command "ZOOM" "P")
        (command "LINE" p0 p1 "")
        (setq entl1 (entlast))
        (command "LINE" p0 p2 "")
        (setq entl2 (entlast))
        (command "TRIM" entl1 entl2 "" p3 "")
        (entdel entl1)
        (entdel entl2)
        (entdel en)
        (command "ZOOM" "W" p3 p1)
        (command "PEDIT" p1 "Y" "X")
        (setq en1 (entlast))
        (command "PEDIT" p2 "Y" "X")
        (setq en2 (entlast))
        (command "PEDIT" en1 "J" midp en2 "" "X")
        (command "ZOOM" "P")
        (command "ARRAY" p1 "" "P" "0,0" N "360" "Y")
      ); segment

      (defun c:sg ()  
         (setting)  
         (spurgear)
         (resetting)  
         (princ)  
      ); c:sg

      (prompt "\n**SPURGEAR.LSP Loaded!")
      (prompt "\n  Enter 'SG' to start")
      ;;;end suprgear.lsp

       楼主| 发表于 2003-1-13 00:36:00 | 显示全部楼层

      Autocad小提示

      怎样一次剪除多条线段
      trim命令中提示选取要剪切的图形时,不支持常用的window和crossing选取方式。当要剪切多条线段时,要选取多次才能完成。这时可以使用fence选取方式。当trim命令提示选择要剪除的图形时,输入“f”,然后在屏幕上画出一条虚线,回车,这时被该虚线接触到的图形全部被剪切掉。(注:在其他功能如延伸(EX)等都可以用相同的方法,你可以试一试.)
      解决R12文件汉字乱码
      用R14打开R12的文件时,即使正确地选择了汉字字形文件,还是会出现汉字乱码,原因是R14与R12采用的代码页不同。可到AutoDesk公司主页下载代码页转换工具wnewcp。运行wnewcp后,首先选中“R11/R12”复选框,再单击“Browse”按钮,选择要转换的文件或目录,然后选择新的代码页,ANSI936或GB2312均可,单击“Start
      Conversion”即开始转换。转换后,在R14中就能正确地显示汉字。

      巧用R12的“命令取消”键
        R14默认的“命令取消”键是“ESC”键,如果你已经习惯了R12的“Ctrl+C”怎么办呢?点击菜单Tools\preferences\compatibility\priority for accelerator keys\autoCAD classic,然后就可以用“Ctrl+C"取消命令了,同时“ESC“键仍然有效。

      发表于 2003-10-15 17:53:00 | 显示全部楼层
      有点深奥,,,
      发表于 2003-10-16 13:48:00 | 显示全部楼层
      太老了点吧现在都用2004版的了不过原理差不多支持一下
      您需要登录后才可以回帖 登录 | 注册

      本版积分规则

      关闭

      招聘信息 上一条 /5 下一条

      关闭

      求职信息 上一条 /5 下一条

      关闭

      技术求助 上一条 /5 下一条

      QQ|小黑屋|手机版|模具论坛 ( 浙ICP备15037217号 )

      GMT+8, 2025-7-17 11:50

      Powered by Discuz! X3.4

      © 2001-2013 Comsenz Inc.

      快速回复
      返回顶部
      返回列表
       
      客服电话:0577-61318188
      模具论坛交流群:
      模具论坛交流群
      工作时间:
      08:30-17:30