明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3943|回复: 11

请教版主SPLINE曲线可以用LISP程序进行动态延长吧?如何做?

  [复制链接]
发表于 2003-9-2 16:22:00 | 显示全部楼层 |阅读模式
不知大家是否注意到在Auto CAD里面用命令"LENGTHEN"可以对ARC、LINE进行延伸,但是发觉不能对SPLINE进行延伸处理的。我一直在考虑所以这个问想请教版主,要象用"LENGTHEN"命令延长ARC、LINE那样延长SPLINE曲线用Auto LISP是如何编写啊?请版主和各位大侠指点指点。
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2003-9-2 16:42:00 | 显示全部楼层
问题是你无法确定它得往哪个方向延伸,是直线延伸还是曲线,如果是曲线又是圆弧还是一个复杂的曲线,如果是圆弧,又怎么知道半径,角度,如果是复杂曲线,又怎么得到这个曲线的方程。
由原有曲线根本无法得到上述参数,所以从理论上就无法延伸的
 楼主| 发表于 2003-9-3 17:18:00 | 显示全部楼层
我看過有一條LSIP程序可以把SPLINE曲線延伸的.它延伸的方式就好象以下的功能選項的做法.
Command:  LENGTHEN
DElta/Percent/Total/DYnamic/<Select object>: DY
Specify new end point.
但是我是剛起步,有很多東西不能夠一時學會,所以希望各位師傅指點.我非常感謝.
发表于 2003-9-3 17:40:00 | 显示全部楼层
看提示就是要增加顶点了,这样的话直接用夹点拉过去不是更好些
 楼主| 发表于 2003-9-5 08:41:00 | 显示全部楼层
尊敬的版主大人,你好.在下經過這几天的學習,寫了一條類似的程序和你一起交流,希望你提出寶貴的見義.現在這個程序只能夠延長spline的起點,到底怎麼樣才可以隨意地進行當選擇spline接近哪邊的端點就延伸哪邊呢,我在考慮中.那麼我為了開發這個功能的做法我認為是比用夾持點优秀和好用的.希望版主幫幫忙.謝謝:)

以下是程序的源代碼:


(defun c:y02()
  (setq a (entsel))
  (setvar "cmdecho" 0)
  (setq os (getvar "osmode" ))
  (setvar "OSMODE" 0)
  (COMMAND "_measure" a 8 )
  (setq ssa (ssget "X" '((0 . "OINT"))))
  (setq ssl (sslength ssa))
  (setq endp (cdr (assoc 10 (entget (ssname ssa 0)))));;諉輪SPLINE笝萸腔珨跺SPLINE奻腔萸
  (setq sp (cdr (assoc 10 (entget (ssname ssa (- ssl 1))))));;;諉輪SPLINE&#63232;萸腔珨跺SPLINE奻腔萸
  (setq n 0)
  (setq ;ssn(ssname a n);;;枑&#63467;SPLINER腔&#63232;萸釴梓
          endata (entget (car a))
          spo (CDR (assoc 10 endata)))
  (repeat (length endata);;;枑&#63467;SPLINER腔笝萸釴梓
    (setq end (cdr (nth n endata)))
    (setq n (1+ n)))
  (princ "\nPlease get dist for lengthen spline:")
  (setq distuser (getdist spo pause))
  (command "line" spo sp "")
  (setq ss (entlast))
  (command "erase" a "");;;刉壺埻懂腔SPLINE
  (command "lengthen" "de" distuser  spo "" "" "")
  (setq ssc (entlast))
  (setq ass (entget ssc))
  (setq newpo(cdr (assoc 10 ass)))
  (command "erase" ssa "");;;刉壺垀衄腔萸
  (command "erase" ss "");;;刉壺最唗赻賒腔腔盄
  (command "erase" ssc "");;;刉壺最唗赻賒腔腔盄
  (entmake endata);;;遠埻最唗眕刉壺腔SPLINE
  (setq a (entlast))
  (command "_splinedit" a "m" "s" spo newpo "x" "");;; spline edit
  (setvar "cmdecho" 1)
  (setvar "osmode" os)
  (princ "\n韜鍔俴怀&#63541;y02遢&#63232;髡夔:")
  (princ))
发表于 2003-9-8 12:38:00 | 显示全部楼层
;;这是照你的恩路写的,但精度不太好
;;用vlisp写会更好
(defun C:Y02_LAI (/         A        ECHO   OS     SSA    SSL    SP
                  ENDP         N        ENDATA SPO    EPO    DISTUSER
                  SSC         NEWPO
                 )

  (defun DO_IT (SPO SP)
    (setq
      DISTUSER
       (getdist SPO "\nPlease get dist for lengthen spline: ")
    )
    (command "_.line" SPO SP "")
    (setq SSC (entlast))
    (command "_.lengthen" "de" DISTUSER (list SSC SPO) "")
    (setq NEWPO (cdr (assoc 10 (entget SSC))))
    (command "_.erase" SSC SSA "")
    ;;只移动端点,精度会比较差
    ;;增加控制点较好!
    (command "_.splinedit" (car A) "m" "s" SPO NEWPO "x" "")
  )

  (setq A (entsel "\nSelect Spline: "))
  (setq ECHO (getvar "osmode"))
  (setvar "cmdecho" 0)
  (setq OS (getvar "osmode"))
  (setvar "OSMODE" 0)
  (command "_.DIVIDE" A 500)                ;精度越密越准,但花时间
  (setq SSA (ssget ""))
  (setq SSL (sslength SSA))
  (setq SP (cdr (assoc 10 (entget (ssname SSA 0)))))
  (setq ENDP (cdr (assoc 10 (entget (ssname SSA (- SSL 1))))))
  (setq N 0)
  (setq        ENDATA (entget (car A))
        SPO    (cdr (assoc 10 ENDATA))
        EPO    (cdr (assoc 10 (reverse ENDATA)))
  )
  (if (< (distance (cadr A) SPO) (distance (cadr A) EPO))
    ;;以上判断有更精碓的方法,但让我偷懒下
    (DO_IT SPO SP)
    (DO_IT EPO ENDP)
  )
  (setvar "cmdecho" ECHO)
  (setvar "osmode" OS)
  (princ)
)
 楼主| 发表于 2003-9-8 14:03:00 | 显示全部楼层
真誠向你代表我深深的謝謝,經過幾天的不斷改進,小包現在把解決這個問題的程序開發出來了,現在和各位分享下,希望大家保持一种樂于交流的心態,讓我們的有更大的進步:
以下是程序的源代碼:

(defun c:y02a(/ a selectpoint os ssa ssl endp sp n endata spo end
             distfulla distfullb distuser ss ssc ass newpo)
  (setq a (entsel))
  (setq selectpoint (cadr a ))
  (setvar "cmdecho" 0)
  (setq os (getvar "osmode" ))
  (setvar "OSMODE" 0)
  (COMMAND "_measure" a 2 )
  (setq ssa (ssget "X" '((0 . "OINT"))))
  (setq ssl (sslength ssa))
  (setq endp (cdr (assoc 10 (entget (ssname ssa 0)))));;諉輪SPLINE笝萸腔珨跺SPLINE奻腔萸
  (setq sp (cdr (assoc 10 (entget (ssname ssa (- ssl 1))))));;;諉輪SPLINE&#63232;萸腔珨跺SPLINE奻腔萸
  (setq n 0)
  (setq ;ssn(ssname a n);;;枑&#63467;SPLINER腔&#63232;萸釴梓
          endata (entget (car a))
          spo (CDR (assoc 10 endata)));;;自動取得spline的起點座標.設成spo變量
  (repeat (length endata);;;枑&#63467;SPLINER腔笝萸釴梓
    (setq end (cdr (nth n endata)));;;自動取得spline的終點座標,設成end變量,
    (setq n (1+ n)))
  (setq distfulla(distance spo selectpoint))
  (setq distfullb(distance end selectpoint))
  (if (> distfullb distfulla)
    (progn
      (princ "\nPlease get dist for lengthen spline:")
      (setq distuser (getdist spo pause));;;繪出spline延長的長度,用鼠標選點确定
      (command "line" spo sp "")
      (setq ss (entlast))
      (command "erase" a "");;;刉壺埻懂腔SPLINE
      (command "lengthen" "de" distuser spo "" "" "")
      (setq ssc (entlast))
      (setq ass (entget ssc))
      (setq newpo (cdr (assoc 10 ass)));;;取得要延長spline延長到的點坐標.
      (command "erase" ssa "");;;刉壺垀衄腔萸
      (command "erase" ss "");;;刉壺最唗赻賒腔腔盄
      (command "erase" ssc "");;;刉壺最唗赻賒腔腔盄
      (entmake endata);;;遠埻最唗眕刉壺腔SPLINE
      (setq a (entlast))
      (command "_splinedit" a "m" "s" spo newpo "x" "");;; spline edit
    )
(progn
  (princ "\nPlease get dist for lengthen spline:")
  (setq distuser (getdist end pause));;;繪出spline延長的長度,用鼠標選點确定
  (command "line" end endp "")
  (setq ss (entlast))
  (command "erase" a "");;;刉壺埻懂腔SPLINE
  (command "lengthen" "de" distuser end "" "" "")
  (setq ssc (entlast))
  (setq ass (entget ssc))
  (setq newpo (cdr (assoc 10 ass)));;;取得要延長spline延長到的點坐標.
  (command "erase" ssa "");;;刉壺垀衄腔萸
  (command "erase" ss "");;;刉壺最唗赻賒腔腔盄
  (command "erase" ssc "");;;刉壺最唗赻賒腔腔盄
  (entmake endata);;;遠埻最唗眕刉壺腔SPLINE
  (setq a (entlast))
  (command "_splinedit" a "m" "s" end newpo "x" "");;; spline edit
  ))
  (setvar "cmdecho" 1)
  (setvar "osmode" os)
  (princ "\n在命令行揄入y02喚起這個功能:")
  (princ))
 楼主| 发表于 2003-9-8 14:11:00 | 显示全部楼层
剛剛進行小小的測試發現版主大人的程序和小包我編的差不多一樣啦.我現在覺得這個小程序要加以改進.因我們(用戶)在選擇時不一定是選擇SPLINE,所以在要在這個程序再加上可以判別如果不是SPLINE就用Auot CAD 原來的 LENGTHEN命令不是很好嗎?

-----------------------------------------------------
我愛CAD.
发表于 2003-9-8 16:55:00 | 显示全部楼层
;;你這個程序到底用在甚麼地方?我總覺得要是它能延伸到某條邊上會更好用!
 楼主| 发表于 2003-9-9 09:09:00 | 显示全部楼层
我寫這個程序是用在製衣行業,我是自己寫來用和贈給同道的朋友一起分享啦.其實你的提意挻不錯.我看看能不能寫出來.我覺得這個功能不錯.但是現在只能增長.不知你可否寫一個可以增長又可以減短的呢?

--------------------------------------------------------------------------------------
我愛CAD,溫故而知新.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-26 22:37 , Processed in 0.205697 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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