找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4029|回复: 38

[分享]:铁路线型

[复制链接]
发表于 2003-7-24 21:13:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
我猜想单纯用“线型”无法实现 铁路线形。那就用线型+Lisp函数吧。哪位有没有简洁的方法?

1. 线型文件中定义一个线型
;以下画虚线(用于铁路线)
*RAILWAY,railway — — — —
A,3,-2

2. 定义一个画线函数c:RAILWAY
其基本的思路是:先用虚线画线;然后绘两个OFFSET线,再将OFFSET线改为continuous 线型和0宽度。

  1. (print "画铁路线命令:RAILWAY")
  2. (DEFUN C:RAILWAY (/ s pt)
  3.   (setq oldltype (getvar "CELTYPE"))
  4.   (setq oldosnap (getvar "OSMODE"))
  5.   (setq oldpinegen (getvar "PLINEGEN"))
  6.   (setq oldpinewid (getvar "PLINEWID"))
  7.   (setq oldceltscale (getvar "CELTSCALE"))
  8.   (setq oldltscale (getvar "LTSCALE"))

  9.   (if (null $linewid)
  10.     (setq $linewid (* oldltscale oldceltscale))
  11.   )

  12.   (initget 6)
  13.   (setq wid (getdist (strcat "线宽<" (rtos $linewid) ">")))
  14.   (if wid
  15.     (setq $linewid wid)
  16.   )

  17.   (setvar "CELTYPE" "railway")
  18.   (setvar "PLINEGEN" 1)
  19.   (setvar "PLINEWID" $linewid)
  20.   (setvar "CELTSCALE" (/ $linewid (getvar "LTSCALE")))
  21.   (command
  22.     "_pline"
  23.     (while (= 1 (getvar "CMDACTIVE")) (command PAUSE))
  24.   )

  25.   (setq ent (entlast))                ;找到刚才画的这个线
  26.   (setq pt (getvar "lastpoint"))        ;最后点
  27.   (setq ang (* (/ pi 180) (getvar "lastangle")));最后线段的角度(弧度)
  28.   (setvar "OSMODE" 0)
  29.   (command "_offset"
  30.            (/ $linewid 2.0)
  31.            ent
  32.            (polar pt (+ ang 1.7 0.2) $linewid)
  33.            ""
  34.   )
  35.   (command "chprop" "last" "" "lt" "continuous" "")
  36.   (command "pedit" "last" "w" 0 "")
  37.   (command "_offset"
  38.            (/ $linewid 2.0)
  39.            ent
  40.            (polar pt (+ ang 1.7 pi) $linewid)
  41.            ""
  42.   )

  43.   (command "chprop" "last" "" "lt" "continuous" "")
  44.   (command "pedit" "last" "w" 0 "")
  45.   (setvar "OSMODE" oldosnap)
  46.   (setvar "CELTYPE" oldltype)
  47.   (setvar "PLINEGEN" oldpinegen)
  48.   (setvar "PLINEWID" oldpinewid)
  49.   (setvar "CELTSCALE" oldceltscale)
  50.   (command "regen")
  51.   (princ)
  52. )

你看出来了,这哪是线型呀,完全是程序,有点笨。不过还是放在这里吧。也许有人感兴趣哪。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2003-7-24 21:21:42 | 显示全部楼层
代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-7-24 21:39:24 | 显示全部楼层
不错,如果黑、白部分等长,还可以用来做水利水电的标尺,或纵断面的纵座标线。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-7-25 09:34:23 | 显示全部楼层
谢谢msdg夸赞。不过斑竹如果也是老菜鸟,我们就没法活了 ;)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-7-26 11:49:43 | 显示全部楼层
我好象不能用,请教。出现如下提示:
错误: AutoCAD rejected function
((ST) (IF (AND (/= ST "Function cancelled") (/= ST "quit / exit abort")) (PRINC
(STRCAT "\n错误: " ST "\n"))) (XDRX_SYSVAR_POP) (XDRX_DRAWING_VIEWRES)
(XDRX_PBAREND) (XDRX_END) (SETQ *ERROR* $XDLSP_ERROR))*Cancel*
望指导一二。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-7-26 13:42:26 | 显示全部楼层
可是现在线形的问题就是假如我在一张图上用几种线形,比例不一样,出不了效果呀,怎么办?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-7-26 13:58:39 | 显示全部楼层
嘿嘿,这个不错啊,可以画防水层嘛
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-7-27 23:50:27 | 显示全部楼层
虽然不错,但你是用新画的方法,在任意既有线上修改成轨道线不更方便?,你想,一条线已经有了,现在要把他画成轨道线,把这条线删掉重画麻烦不?
我这个程序也要设置轨道线线型,线型名取rail。另外我很不喜欢用宽线的Pline而是用颜色表示线宽,道理很简单,带宽度的Pline线当比例变更时很麻烦。至于用什么颜色表示宽线由用户决定,只要改变图层 RAIL_CEN 的定义就行。本程序很长时间没用了,不知有没有错,试试吧。
; RAIL.LSP  改直线,圆弧,多义线为轨道线
; 最近一次修改: 2003.7.29 (这是贴出后又修改过的版本)
;--------------------------------------------------------------------
(defun rail_err(s)
      (if (/= s "Function cancelled")     
        (princ (strcat "\nError: " s))   
      )
      (setvar "osmode" os)
      (setvar "clayer" clay)
      (command "_.UNDO" "_E")                             
)
;================================================

(defun c:rail(/ clay os temp xx sset nsset sslen lw dis ename
                elist  pename pelist pt_cen pt_side_a pt_side_b )
  (setq *error* rail_err)
  (setq clay (getvar "clayer")
          os (getvar "osmode")
  )  
  (if (= rail_rw nil) (setq rail_rw 0.6))
  (if (= dwg_scl nil) (setq dwg_scl (getvar "dimscale")))
  (setq temp T)
  (setvar "osmode" 0)
(while temp
    (prompt (strcat "\n轨道线宽 Width = "(rtos rail_rw)
                    " , 比例因子 Scale = "(rtos dwg_scl)))
    (initget "Width Scale")
    (setq xx (getpoint "\nWidth/ Scale <Select objects> "))
        (cond
           ((= xx "Width")
             (setq xx (getreal (strcat "\nWidth = <"(rtos rail_rw)">:")))
             (if xx (setq rail_rw xx))
           )
           ((= xx "Scale")
             (setq xx (getreal (strcat "\nScale = <"(rtos dwg_scl)">:")))
             (if xx (setq dwg_scl xx))
           )
           (T
             ;(setq temp nil)
             (setq sset (ssget)  temp nil)
           )
           
        )
)

  (setq lw (* dwg_scl rail_rw)  
       dis (/ lw 2.0))
  (if (null (tblsearch "layer" "RAIL_SIDE"))
    (command "_.layer" "_m" "RAIL_SIDE" "_c" "cyan" ""
             "_lt" "continuous" "" "")
  )
  (if (null (tblsearch "layer" "RAIL_CEN"))
    (command "_.layer" "_m" "RAIL_CEN" "_c" "red" ""
             "_lt" "rail" "" "")
  )

  (setq sslen (sslength sset)
        nsset (ssadd))
  (while (> sslen 0)
    (setq temp (ssname sset (setq sslen (1- sslen))))
    (if (or
         (= (cdr (assoc 0 (entget temp))) "LINE")
         (= (cdr (assoc 0 (entget temp))) "POLYLINE")
         (= (cdr (assoc 0 (entget temp))) "LWPOLYLINE")
         (= (cdr (assoc 0 (entget temp))) "SPLINE")
         (= (cdr (assoc 0 (entget temp))) "ARC")
         (= (cdr (assoc 0 (entget temp))) "CIRCLE")
         (= (cdr (assoc 0 (entget temp))) "ELLIPSE")
        )
      (ssadd temp nsset)
    )
  )
  (setq sslen (sslength nsset)
        sset nsset)

  (while (> sslen 0)
    (setq ename (ssname sset (setq sslen (1- sslen)))
          elist (entget ename)
    )
    (del_points)
    (command "_divide" ename 3)
    (setq pename (entlast)
          pelist (entget pename)
          pt_cen (cdr (assoc 10 pelist))
    )
    (del_points)
    (if (= (cdr (assoc 0 (entget ename))) "LWPOLYLINE")
        (command "pedit" ename "w" 0.0 "" )
    )
    (command "change" ename "" "p" "la" "RAIL_SIDE" "lt" "bylayer"
             "c" "bylayer" "")
    (setq pt_side_a (polar pt_cen 1.2 1.0))
    (setq pt_side_b (polar pt_cen (+ 1.2 pi) 1.0))
    (command "offset" dis pt_cen pt_side_a "")
    (command "erase" "l" "")
    (command "offset" dis pt_cen pt_side_b "")
    (command "oops" "")
    (command "change" ename "" "p" "la" "RAIL_CEN" "")
  )
  (setvar "osmode" os)
  (setvar "clayer" clay)
  (princ)
)
;======================= END =======================

; 删除所有点

(defun del_points(/ psset psslen pelist pename)
   (setq psset (ssget "X" (List (cons 0 "POINT" ))))
   (if (/= psset nil)
     (progn
       (setq psslen (sslength psset))
       (while (> psslen 0)
         (command "_erase" (ssname psset (setq psslen (1- psslen))) "")
       )
     )
   )
)
;---------------------------------------------------------------------
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-7-28 16:36:41 | 显示全部楼层
柔柔:我下了你的程序,也做成了RAIL.LSP ,加载运行,输入命令RAIL,出现以下文字:
Command: rail
轨道线宽 Width = 0.6 , 比例因子 Scale = 1
Error: no function definition: AI_ASELECT_.UNDO Enter the number of operations
to undo or [Auto/Control/BEgin/End/Mark/Back] <1>: _E
Command:
命令没执行完,铁路线形也没有形成,为什么?我哪里错了???
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-7-28 18:55:51 | 显示全部楼层
我用的选择对象的那个语句可能你现在的ACAD版本已没有,改用最基本的 ssget 吧。
把    (setq sset (ai_aselect))
改成   (setq sset (ssget))
不过,我在2004上用原来的 (ai_aselect) 也没问题呀。另外,本程序也要有相应的线型。
*RAIL, Rail Linetype, __  __  __  __  __  __  __  __  __  __  _  
A,7,-7
*RAIL1, Rail Linetype1,__  __  __  __  __  __  __  __  __  __  _
A,5,-5
如果你暂时不想设这二个线型也可以,增加二个图层:RAIL_SIDE和RAIL_CEN,RAIL_SIDE 的线型为实线,RAIL_CEN 的线型为一般虚线。程序内是这么设的,如果没有这二个图层则程序创建,有了程序就不管了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-7-29 01:34:06 | 显示全部楼层
柔柔不柔,挺厉害呀
To qqqf :你出现问题的代码不是我的程序中的。
To 萧山:我的本意是想保证图线的填充部分(黑段)与线宽比例为固定(这里是3:1),这样符合视觉习惯。因此线型比例根据线宽自动确定。如果你有特殊需要,可以在画完后修改这条线的线型比例,当然也可以修改程序代码加上比例输入。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-7-29 10:06:21 | 显示全部楼层
对不起,我那程序有缺陷:轨道线宽和比例因子无法由用户设置。我已修改上面贴出的程序,怎么不能全显啊?作为附件吧。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-7-29 20:33:09 | 显示全部楼层
柔柔:我下了你的程序,运行后有以下几个问题向你请教:
1.为什么运行后不能绘出daziran 那样的图,你只有三条线而已;2.如果不用图层行不行?
daziran :运行后出现如下错误:
Command:RAILWAY
线宽<1>
Error: AutoCAD 变量设置被拒绝: "CELTYPE" "railway"; 错误: *error*
函数中发生错误AutoCAD 变量设置被拒绝: "osmode" nil
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-7-29 22:03:37 | 显示全部楼层
是三条线,轨道线不就是二细一粗三根线组成的吗?我在上面帖子里强调:“我很不喜欢用宽线的Pline而是用颜色表示线宽”,你把中间那条线定义为粗线打印不就行啦。2000以后的版本,把粗线线宽在图层内设置好,让它显示,效果就有了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-8-1 22:20:19 | 显示全部楼层
最初由 liuzqyh 发布
daziran :运行后出现如下错误:
Command:RAILWAY
线宽<1>
Error... [/B]


您是否事先定义并装入了RAILWAY ?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-11 01:54 , Processed in 0.429257 second(s), 61 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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