找回密码 注册 QQ登录
开思网工业级高精度在线3D打印服务

iCAx开思网

CAD/CAM/CAE/设计/模具 高清视频【积分说明】如何快速获得积分?快速3D打印 手板模型CNC加工服务在线3D打印服务,上传模型,自动报价
查看: 17649|回复: 3
打印 上一主题 下一主题

【求助】autolisp的问题!!

[复制链接]
跳转到指定楼层
1
发表于 2003-9-5 20:34:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多同行朋友,交流,分享,学习。

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

x
主要是trim不会用
呵呵,见笑了
(defun jx ()
(setq os (getvar "OSMODE"))
(setvar "OSMODE" 0)
(Command "LINE" (list 0 0) (list 0 50) "")   ;画一条线段A
(Command "LINE" (list 30 0) (list 30 50) "")  ;再画一条线段B
(Command "LINE" (list -10 25) (list 50 50) "")  ;画一条线段与AB相交
(Command "trim" (list 0 30) (list 30 30) "" (list 15 25) "E")  ;删掉夹在A,B之间
的那段
(setvar "OSMODE" os)
)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 赞一下!赞一下!
2
发表于 2003-9-6 11:29:38 | 只看该作者
(Command "LINE" (list 0 0) (list 0 50) "") ;画一条线段A  
(Command "LINE" (list 30 0) (list 30 50) "") ;再画一条线段B  
(Command "LINE" (list -10 25) (list 50 50) "") ;画一条线段与AB相交  
(Command "trim" (list 0 30) (list 30 30) "" (list 15 25) "E") ;删掉夹在A,B之间  
的那段  
其中的左右 " 符號數目似乎不相同。
3
发表于 2003-9-6 12:47:56 | 只看该作者
5.3  对象描述双元表及其使用
“双元表”,是AutoLISP特有的表数据类型之一,是一种针对AutoCAD数据库所特有的检索指针,就像是 (EntSel) 函数的返回值那样的数据结构。实际上也可以用 (List) 函数,按这种格式组成自定义的双元表。这种特有的数据结构,是在程序中使用CAGD技术的关键之一。
对于一些编辑命令,在指目标时,所指点位与处理的结果有关,就要在AutoLISP 中应当用双元表来“精确响应”要目标的提示,这也是AutoLISP特有的、相当有实用价值的技巧。这类命令有:DIM、EXTEND、TRIM、FILLET、CHAMFER、DIVIDE、MEASURE等等。下面有几个例子来说明双元表的使用技术:
例I:
如用 AutoLISP 制作的功能绘制较大图幅的图形时,一般是在全图幅显示下自动绘图,以便全面查看生成过程。在画机械图时,标尺寸是基本要求。但多数情况下要标尺寸的图线比较密集,其近旁还有不少其它对象,用指定点位来指目标,即使把目标选择框设置得相当小,也会一下子套住好几个目标,造成标注失败。如果为了能唯一地选中目标在程序中使用了 'ZOOM-W,又会加长运行时间。
较好的处理是使用双元表来响应关于DIM中“选择标注对象: ”的提示。用指定对象双元表的方法比指两个点标尺寸更方便和准确,而且能够标注各种尺寸。
如果EN是想要标注尺寸的图线的对象名(一般条件下可以在画好该对象后,紧接着用 (SetQ en (EntLast)) 得到),而 PT 是该对象上的,或对象近旁的一个点的点位表。一般直接使用生成该对象时的所用的点位。更详细的内容在下一个题目中讨论。
例II  :
除了标尺寸之外,双元表还有许多用法。例如,一个生成齿条图形的工具程序(使用Tools.DWG,参见Tools.LSP):
(Defun C:CT ()
        (SetQ m (GetReal "模数: ")
             p0 (GetPoint "\n基点: ") x0 (Car p0) y0 (Cadr p0)
             l (GetDist p0 "\n总长度: ")  
            ll 0
       )
       (While (> (+ m l) ll)
                (Command "insert" "*c" (List x0 y0) m 0)
               (SetQ x0 (+ x0 (* m Pi)) ll (+ ll (* m Pi)))
      )
       (Command "pedit" (EntLast) "j" (SsGet "x" '((62 . 2))) "" "")
      (SetQ ctn (EntLast) x0 (Car p0) y0 (Cadr p0))
       (Command "color" 9
                "line" (List x0 (+ y0 m)) (List x0 (- y0 m m)) ""
                "trim" (EntLast) "" ;; 左端修整
                           (List ctn (Polar p0 Pi (+ (* Pi m) 10))) ""
      )  
      (Command "color" 9
                   "line" (List (+ l x0) (+ y0 m))
(List (+ l x0) (- y0 m m))  
                       ""
                  "trim" (EntLast) "" ;;右端修整
                           (List ctn (Polar p0 0 (+ (* Pi m) l 10))) ""       
                  "erase" (SsGet "x" '((62 . 9))) ""
                  "color" 7
                 "line" (List (- x0 m) y0) (List (+ x0 m l) y0) ""
                  "change" (EntLast) "" "p" "lt" "DHX" ""
      )
      (PrinC)
)
为能使齿条图形的长度尺寸符合要求,又要避开复杂的点位解析描述,在程序中用了TRIM命令处理左右两端的齿条修整,这又是CAGD功能的典型用法。左、右端的长度修整是用双元表响应TRIM命令,为了计算简便,所指点没有落在齿条轮廓线之上,其实本来也没有必要落在图线上,这个点的作用仅仅是指示方向。
对于LWPolyLine,修剪之后的对象名称不变,可以接着继续使用它。如果是老的多段线(PolyLine),因为它是一种复杂对象,在修剪之后将会重新生成图元名,必须用 (EntLast) 重新取出当前对象名称。
例III:
用等分对象之后的生成的点位,加上对象原来的始末两端点作为基础,“描绘”成与这个对象类型不同、几何形状很相同的图线。例如将样条线 (SPline) 转换成多段线 (PpolyLine) 的程序 (T502.LSP):
   
    (Defun C:ASpline ()
       (Defun SEPoint (sen)
               (SetQ sel (EntGet sen) snn 0 spl '())
               (While (SetQ spp (Nth snn sel))
                     (If (= 10 (Car spp))(SetQ spl (Cons (Cdr spp) spl)))
                     (SetQ snn (1+ snn))
               )
               (List (Last spl)(Car spl))
       )
       (SetQ se (Car (EntSel "\nA SPline: "))
           sn (GetDist "\nLength of lines: ")
           sp (SEPoint se)
           sc (GetVar "cecolor")
       )
       (Command "color" 123
               "measure" (List se (Cdr (Car sp))) sn
       )
       (SetQ ss (SSGet "x" '((62 . 123)(0 . "OINT")))
            sn (SSLength ss) snn (1- sn)
       )
       (Command "color" sc "3dpoly" (Car sp))
       (Repeat sn
         (SetQ spn (SSName ss snn))
         (SetQ sdp (Cdr (Assoc 10 (EntGet spn))))
         (SetQ snn (1- snn))
         (Command sdp)
       )
       (Command (Cadr sp) "" "erase" ss "")
       (EntDel se)
       (PrinC)
)
首先,我们用 (SEPoint) 函数遍历这条样条线的所有控制点,返回始末两点的数据表:’(起点点位 末点点位),然后按照用户的期望进行定距等分,并取出这些点,与原线始末两点配合,生成新的多段线。
  Measure将从这条线上,距所指点较近的端点开始等分。如果用了 (EntSel) 函数接受的用户指定样条线时的结果,很难保证一定会在起点处开始等分,这样的确定与不确定之间就难以形成必然的规则。最好就是Measure的方向与原线始末点的方向一致。于是,有下面的表达式:
(Command "measure" (List se (Car sp)) sn)
这样,双元表的对象名沿用了用户指定的、而点位则强令使用原线的起点点位。这就保证了上边的要求,使程序顺畅、简洁。
  
注意:
尽量不要在 VL-CmdF 函数中用双元表数据结构,否则可能提示:
应用程序错误: 发送到 ads_cmd 的类型无效
  
摘自《Visual LISP for AutoCAD 2002——技巧与范例》
4
发表于 2003-9-6 15:02:33 | 只看该作者
chenhu wrote:
主要是trim不会用  
  呵呵,见笑了  
  (defun jx ()  
  (setq os (getvar "OSMODE"))  
  (setvar "OSMODE" 0)  
  (Command "LINE" (list 0 0) (list 0 50) "")   ;画一条线段A  
  (Command "LINE" (list 30 0) (list 30 50) "")  ;再画一条线段B  
  (Command "LINE" (list -10 25) (list 50 50) "")  ;画一条线段与AB相交  
  (Command "trim" (list 0 30) (list 30 30) "" (list 15 25) "E")  ;删掉夹在A,B之间  
  的那段  
  (setvar "OSMODE" os)  
  )

  
在LISP里用trim命令我倒没有试过,主要是太麻烦了,不太好控制!如果只是删除两头一段的话,还可以试试!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3D打印手板模型快速制作服务,在线报价下单!

QQ 咨询|手机版|联系我们|iCAx开思网  

GMT+8, 2025-1-24 05:08 , Processed in 0.024608 second(s), 11 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2025 www.iCAx.org

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