明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2132|回复: 7

[LISP]关于此三维螺旋线程序的一点疑问?

[复制链接]
发表于 2003-12-10 23:04:00 | 显示全部楼层 |阅读模式
曾在mjtd论坛中看到这样的一个程序(龙龙仔编,见下面),但是有几点不明白的地方,请帮忙!
我的问题是:
1-------怎么控制螺旋线的起点和终点?(若不可控制,请完善)
2-------我想用"revolve"命令以此螺旋线为扫描路径,扫描一出一个螺纹实体,但总是提示“Axis must be a line or a   polyline.”,是不是因为螺旋线是3dpoly,“revolve”命令不支持?
3-------请给出常用的扫描相关的命令
4-------我的方法可行否?若可行,如何实现?

请各位前辈指点一下,不胜感激!

程序如下

  1. ;;BY LUCAS(龙龙仔)
  2. ;;将spline等分为n个弧,再转为pline
  3. ;;只对2D spline有效, 3D spline要改用3dpoly
  4. (defun C:SPLINE_TO_PLINE (/ HOLDECHO    OS   SSS NUMPT N
  5.      ED ED1   PTST  PTEND SS2 PT1   PT2
  6.      PT3 J     ENT   NNO   SS SSL
  7.     )

  8.   (defun VAL1 (N SS INDEX)
  9.     (cdr (assoc N (entget (ssname SS INDEX))))
  10.   )

  11.   (defun CH_IT (NOS)
  12.     (if (assoc NOS ED)
  13.       (progn
  14. (if (assoc NOS ENT)
  15.    (setq ENT (subst (assoc NOS ED) (assoc NOS ENT) ENT))
  16.    (setq ENT (append ENT (list (assoc NOS ED))))
  17. )
  18. (entmod ENT)
  19.       )
  20.     )
  21.   )

  22.   (setq HOLDECHO (getvar "cmdecho"))
  23.   (setvar "cmdecho" 0)
  24.   (command "_.undo" "group")
  25.   (setq OS (getvar "osmode"))
  26.   (setvar "osmode" 0)
  27.   (prompt "\nPlease pick the spline: ")
  28.   (setq SSS (ssget '((0 . "spline"))))
  29.   (if SSS
  30.     (progn
  31.       (initget (+ 1 2 4))
  32.       (setq NUMPT
  33.       (getint
  34.         "\nPlease specify the accuracy of conversion: "
  35.       )
  36.       )
  37.       (setq N 0)
  38.       (setq SSL (sslength SSS))
  39.       (repeat SSL
  40. (prompt (strcat "\r余 " (itoa (- SSL N)) " 个物件     "))
  41. (setq ED1 (ssname SSS N))
  42. (setq ED (entget ED1))
  43. (setq PTST  (cdr (assoc 10 ED))
  44.        PTEND (cdr (assoc 10 (reverse ED)))
  45. )
  46. (command "_.divide" ED1 (* 2 NUMPT))
  47. (setq SS2 (ssget "p"))
  48. (if (= (logand (cdr (assoc 70 ED)) 1) 1)
  49.    (setq J 1)
  50.    (setq J 0)
  51. )
  52. (setq PT3 PTST)
  53. (setq SS (ssadd))
  54. (repeat NUMPT
  55.    (setq PT2 (VAL1 10 SS2 J))
  56.    (if (/= NUMPT (/ (+ J 2) 2))
  57.      (setq PT1 (VAL1 10 SS2 (+ 1 J)))
  58.      (setq PT1 PTEND)
  59.    )
  60.    (command "_.arc" PT3 PT2 PT1)
  61.    (ssadd (entlast) SS)
  62.    (setq PT3 PT1)
  63.    (setq J (+ 2 J))
  64. )
  65. (command "_.pedit" (ssname SS 1) "" "j" SS "" "")
  66. (setq ENT (entget (entlast)))
  67. (foreach NNO '(6 8 62 48)
  68.    (CH_IT NNO)
  69. )
  70. (command "_.erase" SS2 ED1 "")
  71. (setq N (1+ N))
  72.       )
  73.       (prompt (strcat "\r完成转换                               ")
  74.       )
  75.     )
  76.     (alert "Nothing selected!!")
  77.   )
  78.   (setvar "osmode" OS)
  79.   (command "_.undo" "end")
  80.   (setvar "cmdecho" HOLDECHO)
  81.   (princ)
  82. )
发表于 2003-12-11 08:15:00 | 显示全部楼层
这个是将SPLINE转换为PLINE的程序,螺旋线的程序你再找找看
发表于 2003-12-11 16:27:00 | 显示全部楼层
(princ "\n   *******************************************************")
    (princ "\n   *                                                     *")
    (princ "\n   *         AUTOCAD-R2000-lisp壓縮彈簧繪製程序          *")
    (princ "\n   *                              --- 羅  昌  凌         *")
    (princ "\n   *          地址:湖南懷化華峰電子六分廠               *")
    (princ "\n   *      個人主頁:http://luocl-cad.myrice.com          *")
    (princ "\n   *        QQ: 43068381   電話:0745-2750458            *")
    (princ "\n   *           E-mail: lcl2094_cn@sina.com               *")
    (princ "\n   *                                                     *")
    (princ "\n   *******************************************************\n")
 楼主| 发表于 2003-12-11 20:31:00 | 显示全部楼层
哦,对不起,昨天复制错误了!
螺旋线的程序如下:
//代碼
;;; 3DSPIRAL.LSP
;     Copyright (C) 1992 by Autodesk, Inc.
; modified by CAD Studio, 2001 (globalization)
; 修改者:明經通道 http://www.mccad.net/ 2001 (中文化)
;
;     Permission to use, copy, modify, and distribute this software
;     for any purpose and without fee is hereby granted, provided
;     that the above copyright notice appears in all copies and that
;     both that copyright notice and this permission notice appear in
;     all supporting documentation.
;
;     THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED
;     WARRANTY.  ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR
;     PURPOSE AND OF MERCHANTABILITY ARE HEREBY DISCLAIMED.
;;; --------------------------------------------------------------------------;
;;; DESCRIPTION
;;;
;;;   這是一個程序實例。
;;;
;;;   由 Kelvin R. Throop 于 1985 年 1 月設計編制。
;;;
;;;   該程序生成一螺旋線。它可通過輸入“spiral”、“3dspiral”來加載及調用,
;;;   也可以通過以下表達式調用:
;;;   (cspiral <# 旋轉圈數> <基點> <每圈的水平增加距离>
;;;            <每圈的點數> <起始半徑>
;;;            <每圈的垂直上升距离>).
;;;
;;; --------------------------------------------------------------------------;

(defun myerror (s)                    ; 如果出錯 (如按 CTRL-C)
                                      ; 將激活該命令...
  (if (/= s "Function cancelled")
    (princ (strcat "\n出錯: " s))
  )
  (setvar "cmdecho" ocmd)             ; 恢复保存的模式
  (setvar "blipmode" oblp)
  (setq *error* olderr)               ; 恢复舊的 *error* 處理
  (princ)
)

(defun cspiral (ntimes bpoint hfac lppass strad vfac
                / ang dist tp ainc dhinc dvinc circle dv)

  (setvar "blipmode" 0)               ; 關閉亮顯
  (setvar "cmdecho" 0)                ; 關閉命令行提示
  (setvar "osmode" 0)                ; 關閉命令行提示

  (setq circle (* 3.141596235 2))
  (setq ainc (/ circle lppass))
  (setq dhinc (/ hfac lppass))
  (if vfac (setq dvinc (/ vfac lppass)))
  (setq ang 0.0)
  (if vfac
    (setq dist strad dv 0.0)
    (setq dist 0.0)
  )
  (if vfac
    (command "_3dpoly")                ; 開始螺旋 ...
    (command "_pline" bpoint)          ; 由基點開始螺旋...
  )
  (repeat ntimes
    (repeat lppass
      (setq tp (polar bpoint (setq ang (+ ang ainc))
                      (setq dist (+ dist dhinc))
               )
      )
      (if vfac
          (setq tp (list (car tp) (cadr tp) (+ dv (caddr tp)))
                dv (+ dv dvinc)
          )
      )
      (command tp)                    ; 繼續繪制下個點...
    )
  )
  (command "")                        ; 直到完成。
  (princ)
)

;;;
;;;       交互螺旋生成
;;;

(defun C:SPIRAL (/ olderr ocmd oblp nt bp cf lp)
  ;;;;(setq olderr  *error*
  ;;;;      *error* myerror)
  (setq ocmd (getvar "cmdecho"))
  (setq oblp (getvar "blipmode"))
  (setvar "cmdecho" 0)
  (initget 1)                         ; bp 必須為非空值
  (setq bp (getpoint "\n中心點: "))
  (initget 7)                         ; nt 必須為非零正數或非空值
  (setq nt (getint "\n螺旋圈數: "))
  (initget 3)                         ; cf 必須為非零或非空值
  (setq cf (getdist "\n每圈增加距离: "))
  (initget 6)                         ; lp 必須為非零正數
  (setq lp (getint "\n每圈的點數<30>: "))
  (cond ((null lp) (setq lp 30)))
  (cspiral nt bp cf lp nil nil)
  (setvar "cmdecho" ocmd)
  (setvar "blipmode" oblp)
  (setq *error* olderr)               ; 恢复舊的 *error* 處理
  (princ)

)

;;;
;;;       Interactive spiral generation
;;;

(defun C:3DSPIRAL (/ olderr ocmd oblp nt bp hg vg sr lp)
  ;;;;(setq olderr  *error*
  ;;;;      *error* myerror)
  (setq ocmd (getvar "cmdecho"))
  (setq oblp (getvar "blipmode"))
  (setvar "cmdecho" 0)
  (initget 1)                         ; bp 必須為非空值
  (setq bp (getpoint "\n中心點: "))
  (initget 7)                         ; nt 必須為非零正數或非空值
  (setq nt (getint "\n螺旋圈數: "))
  (initget 7)                         ; sr 必須為非零正數或非空值
  (setq sr (getdist bp "\n起點半徑: "))
  (initget 1)                         ; hg 必須為非空值
  (setq hg (getdist "\n水平每圈增加距离: "))
  (initget 3)                         ; vg 必須為非零或非空值
  (setq vg (getdist "\n垂直每圈上升距离: "))
  (initget 6)                         ; lp 必須為非零正數
  (setq lp (getint "\n每圈的點數 <30>: "))
  (cond ((null lp) (setq lp 30)))
  (cspiral nt bp hg lp sr vg)
  (setvar "cmdecho" ocmd)
  (setvar "blipmode" oblp)
  (setq *error* olderr)               ; 恢复舊的 *error* 處理
  (princ)

)

;;; --------------------------------------------------------------------------;
(princ "\n\tC:SPIRAL 和 C:3DSPIRAL 已加載。 ")
(princ)
 楼主| 发表于 2003-12-12 16:07:00 | 显示全部楼层
请高手赐教!!
发表于 2003-12-12 16:47:00 | 显示全部楼层
赐教甚麼??
 楼主| 发表于 2003-12-12 23:34:00 | 显示全部楼层
龙龙仔发表于2003-12-12 16:47:00赐教甚麼??



1-------怎么控制螺旋线的起点和终点?(若不可控制,请完善)
2-------我想用"revolve"命令以此螺旋线为扫描路径,扫描一出一个螺纹实体,但总是提示“Axis must be a line or a   polyline.”,是不是因为螺旋线是3dpoly,“revolve”命令不支持?
3-------请给出常用的扫描相关的命令
4-------我的方法可行否?若可行,如何实现?
发表于 2003-12-15 08:50:00 | 显示全部楼层
看看3樓的網址好嗎!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-10-1 19:30 , Processed in 0.201337 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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