明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1453|回复: 4

用图元创建多线时,如何设置线宽?

[复制链接]
发表于 2013-1-27 13:38 | 显示全部楼层 |阅读模式
本帖最后由 ynhh 于 2013-1-27 13:39 编辑

请教大师,用图元创好多线时如何加入线宽的设置?41和42,或43等几个位置的设置均无法成功。不知是什么原因,请大师指点。
谢谢

以下是用下载的程序改的,但线宽设置有问题无法应用?

(defun AAA  (pts Xk);

(if (entmake (append (list '(0 . "LWPOLYLINE")
'(100 . "AcDbEntity")
'(100 . "AcDbPolyline")
      
'(43 . XK);此处设置无法正常运转

(cons 90 (length pts))
         )
         (mapcar '(lambda (x) (cons 10 (trans x 1 0))) pts)
         '((210 0. 0. 1.))
      
        )
      )
    (entlast)
  )
)
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2013-1-27 16:26 | 显示全部楼层
'(43 . XK)改成(cons 43 xk)

点评

以下这个动态程序中的两个直线,我想改为一个多段线。也就是在动态应用中直接更新多段线  发表于 2013-1-29 16:53
请教大师:能在动态中应用多段线吗?如能的话再加上线宽就更好了。请大师指点啊  发表于 2013-1-29 12:41
大师的方法果然正确。能再请教你指点一下这个动态更新多线的程序吗?  发表于 2013-1-27 17:25
 楼主| 发表于 2013-1-27 17:24 | 显示全部楼层
感谢大师的热心指点.
你说的很有道理

能不能再请教你一个以下程序想改为动态的多线更新问题?
感谢你的热心指点

(defun zcx()
    (setvar "osmode" 0)
    ;(setq p2 (getpoint P1 "\n-->请指定文字位置:")
  (setq p2 (polar p1 0 10)
        a1 (car p1 )
        c1 (car p2)
        vx (* (- (strlen TXT) 0.2) (* ht 0.75))     
        le vx
    )
    (if (< c1 a1)
    (setq pp (polar p2 pi le)
   p3 (polar pp (/ pi 2) zj)
    )
  (setq pp (polar p2 0 le)
p3 (polar p2 (/ pi 2) zj)
  ))
  (command "line" p1 p2 "")
  (setq en1 (entlast))
  (command "line" p2 pp "")
  (setq en2 (entlast))
  
;;;请教大师:我想到两根直线合并为一根带线宽的多线,但不知如何实现动态更新?有此功能吗?如有请教方法,感谢你。
(setq XK 0.3);设置线宽
(setq pts (list p1 p2 PP));将多个点合成一个点表
(HDX pts XK);画带线宽的多线
(setq en20 (entlast))
  
;;;  (command "text" P3 ht 0 TXT)
(command "TEXT" "J" "ML" P3 ht "0" TXT);----画样式写入文字
  (setq en3 (entlast));entlast 返回最后一个未删除的主图元名。
  (setq ent1 (entget en1); entget 此函数将由数据库中取出 ename 的图元, 同时返回一表
ent2 (entget en2)
ent3 (entget en3))
  (setq le1 (caadr (textbox ent3))); textbox 这个函数将计算一个文字图元并返回包围文字的交互坐标框。
  (setq le (* 1.2 le1)
jl (* 0.1 le1))
;;|;;
  (while (= (car (setq mouse (grread t 0 0))) 5)
      (setq pt (cadr mouse))
      
      (if (>= (car pt)(car p1))
(progn
;以下句子可自行简写
   (setq pt (trans pt 1 0))
   (setq ent1 (subst (cons 11 pt)(assoc 11 ent1) ent1))
; subst 此函数将在 list 寻找所给定的 olditem, 然后再依据所给定的 newitem 来取代每一个 olditem。但当找不到 list 中的 olditem 时, 此函数将返回原有的 list。
;cons 它是“构造”(construct) 表的最基本函数, 它将一个元素 (new-first-element) 与一个表 (list) 接合起来, 并返回以此新元素为首的新表。
;assoc 此函数将在联合表 (association list) alist 中搜寻以item 为名称的对应值, 如果找到, 则 assoc 会返回其对应值。若找不到, 则会返回 nil。
   (entmod ent1); entmod 函数来更新数据库内的图元。
   (setq ent2 (subst (cons 10 pt)(assoc 10 ent2) ent2))
   (entmod ent2)
   (setq ent2 (subst (cons 11 (trans (polar (trans pt 0 1) 0 le) 1 0))(assoc 11 ent2) ent2))
   (entmod ent2)
   (setq ent3 (subst '(72 . 0) (assoc 72 ent3) ent3))
   (setq ent3 (subst (cons 10 (list (+ (car pt) jl) (+ (cadr pt) zj)))(assoc 10 ent3) ent3))
   (setq ent3 (subst (cons 11 (list (+ (car pt) jl) (+ (cadr pt) zj)))(assoc 11 ent3) ent3))
   (entmod ent3)
   )
(progn
   (setq pt (trans pt 1 0))
   (setq ent1 (subst (cons 11 pt)(assoc 11 ent1) ent1))
   (entmod ent1)
   (setq ent2 (subst (cons 10 pt)(assoc 10 ent2) ent2))
   (entmod ent2)
   (setq ent2 (subst (cons 11 (trans (polar (trans pt 0 1) PI le) 1 0))(assoc 11 ent2) ent2))
   (entmod ent2)
   (setq ent3 (subst '(72 . 2) (assoc 72 ent3) ent3))
   (setq ent3 (subst (cons 10 (list (- (car pt) jl) (+ (cadr pt) zj)))(assoc 10 ent3) ent3))
   (setq ent3 (subst (cons 11 (list (- (car pt) jl) (+ (cadr pt) zj)))(assoc 11 ent3) ent3))
   (entmod ent3)
   )
)
    );while
;;|;;
  (princ)
  )
(defun c:A ()
(setq AA (getvar "clayer"))
(setq layer "文字     text")(if (not (tblsearch "layer" layer ))
  (progn (command "layer" "new" "文字     text" "s" "文字     text" "C" 212 "" "L" "Continuous" "" "LW" 0.2 "" "")
))
     (COMMAND "CLAYER" layer)
    (setvar "texteval" 1)
    (setvar "cmdecho" 0)
    (setq vv (getvar "osmode"))
;;;     (setq ht (getreal "\n-->标注字高默认:2.5)"))
(setq ht 3);暂用固定练习
   (if (= ht nil) (setq ht 2.5))
    (setq zj (/ ht 3))
    (setq n 0)
    (while (= n 0)
;;;       (setq TXT (getstring "\n-->请输入文字:"))
(setq TXT "操作练习");暂用固定练习
     (setvar "osmode" 33)
      (if (/= txt "")
         (setq   p1 (getpoint "\n-->请指定点坐标:")
        )
)
     (if (= txt "") (setq n 1)(zcx))
)
    (setvar "osmode" vv)
    (princ)
)
;;;以下是一个找来的用图元方法画多线,但不知如何在动态中更新,也请大师指点
(defun HDX (pts XK)
  (if (entmake
(append (list '(0 . "LWPOLYLINE")
        '(100 . "AcDbEntity")
        '(100 . "AcDbPolyline")
        (cons 90 (length pts))
                      (cons 43 xk)
  )
(mapcar '(lambda (x) (cons 10 (trans x 1 0))) pts)
  '((210 0. 0. 1.))
)
      )
    (entlast)
  )
)

点评

唉,实在不明白你想要什么!最好表达清楚具体一些!  发表于 2013-1-29 14:07
你是指动态更新线宽吗?  发表于 2013-1-29 10:13
发表于 2013-1-29 18:32 | 显示全部楼层
本帖最后由 springwillow 于 2013-1-29 18:37 编辑
ynhh 发表于 2013-1-27 17:24
感谢大师的热心指点.
你说的很有道理


看看吧,是不是这样
  1. (defun zcx()
  2.     (setvar "osmode" 0)
  3.     ;(setq p2 (getpoint P1 "\n-->请指定文字位置:")
  4.   (setq p2 (polar p1 0 10)
  5.         a1 (car p1 )
  6.         c1 (car p2)
  7.         vx (* (- (strlen TXT) 0.2) (* ht 0.75))     
  8.         le vx
  9.     )
  10.     (if (< c1 a1)
  11.     (setq pp (polar p2 pi le)
  12.    p3 (polar pp (/ pi 2) zj)
  13.     )
  14.   (setq pp (polar p2 0 le)
  15. p3 (polar p2 (/ pi 2) zj)
  16.   ))
  17.   (setq en1 (HDX (list (setq p11 (polar p1 0 0.1)) p2 PP) 0.1))
  18.   ;(command "line" p2 pp "")
  19.   ;(setq en2 (entlast))
  20.   
  21. ;;;请教大师:我想到两根直线合并为一根带线宽的多线,但不知如何实现动态更新?有此功能吗?如有请教方法,感谢你。
  22. (setq XK 0.3);设置线宽
  23. (setq en20 (HDX (list p1 PP) XK));画带线宽的多线)
  24.   
  25. ;;;  (command "text" P3 ht 0 TXT)
  26. (command "TEXT" "J" "ML" P3 ht "0" TXT);----画样式写入文字
  27.   (setq en3 (entlast));entlast 返回最后一个未删除的主图元名。
  28.   (setq ent1 (entget en1); entget 此函数将由数据库中取出 ename 的图元, 同时返回一表
  29. ;ent2 (entget en2)
  30. ent3 (entget en3))
  31.   (setq le1 (caadr (textbox ent3))); textbox 这个函数将计算一个文字图元并返回包围文字的交互坐标框。
  32.   (setq le (* 1.2 le1)
  33. jl (* 0.1 le1))
  34. ;;|;;
  35.   (while (= (car (setq mouse (grread t 0 0))) 5)
  36.       (setq pt (cadr mouse))
  37.       
  38.       (if (>= (car pt)(car p1))
  39. (progn
  40. ;以下句子可自行简写
  41.     (setq pt (polar pt 0 1))
  42.    (setq pt (trans pt 1 0))
  43.    (setq ent1 (subst (cons 10 (3D->2D pt))(cons 10 (3D->2D p2)) ent1))
  44.   (setq p2 pt)
  45.   (setq ent1 (subst (cons 10 (3D->2D(trans (polar  pt 0 le) 1 0)))(cons 10 (3D->2D pp)) ent1))
  46.   (setq pp (trans (polar (trans pt 0 1) 0 le) 1 0))
  47.    (setq ent1 (subst (cons 10 (3D->2D p1))(cons 10 (3D->2D p11)) ent1))
  48. ; subst 此函数将在 list 寻找所给定的 olditem, 然后再依据所给定的 newitem 来取代每一个 olditem。但当找不到 list 中的 olditem 时, 此函数将返回原有的 list。
  49. ;cons 它是“构造”(construct) 表的最基本函数, 它将一个元素 (new-first-element) 与一个表 (list) 接合起来, 并返回以此新元素为首的新表。
  50. ;assoc 此函数将在联合表 (association list) alist 中搜寻以item 为名称的对应值, 如果找到, 则 assoc 会返回其对应值。若找不到, 则会返回 nil。
  51.    (entmod ent1); entmod 函数来更新数据库内的图元。
  52.    (setq ent3 (subst '(72 . 0) (assoc 72 ent3) ent3))
  53.    (setq ent3 (subst (cons 10 (list (+ (car pt) jl) (+ (cadr pt) zj)))(assoc 10 ent3) ent3))
  54.    (setq ent3 (subst (cons 11 (list (+ (car pt) jl) (+ (cadr pt) zj)))(assoc 11 ent3) ent3))
  55.    (entmod ent3)
  56.    )
  57. (progn
  58.    (setq pt (trans pt 1 0))
  59.    (setq ent1 (subst (cons 10 (3D->2D pt))(cons 10 (3D->2D p2)) ent1))
  60.   (setq p2 pt)
  61.   (setq ent1 (subst (cons 10 (3D->2D (trans (polar (trans pt 0 1) PI le) 1 0)))(cons 10 (3D->2D pp)) ent1))
  62.   (setq pp (trans (polar (trans pt 0 1) PI le) 1 0))
  63.    (entmod ent1)
  64.    (setq ent3 (subst '(72 . 2) (assoc 72 ent3) ent3))
  65.    (setq ent3 (subst (cons 10 (list (- (car pt) jl) (+ (cadr pt) zj)))(assoc 10 ent3) ent3))
  66.    (setq ent3 (subst (cons 11 (list (- (car pt) jl) (+ (cadr pt) zj)))(assoc 11 ent3) ent3))
  67.    (entmod ent3)
  68.    )
  69. )
  70.     );while
  71. ;;|;;
  72.   (princ)
  73.   )
  74. (defun c:A ()
  75. (setq AA (getvar "clayer"))
  76. (setq layer "文字     text")(if (not (tblsearch "layer" layer ))
  77.   (progn (command "layer" "new" "文字     text" "s" "文字     text" "C" 212 "" "L" "Continuous" "" "LW" 0.2 "" "")
  78. ))
  79.      (COMMAND "CLAYER" layer)
  80.     (setvar "texteval" 1)
  81.     (setvar "cmdecho" 0)
  82.     (setq vv (getvar "osmode"))
  83. ;;;     (setq ht (getreal "\n-->标注字高:(默认:2.5)"))
  84. (setq ht 3);暂用固定练习
  85.    (if (= ht nil) (setq ht 2.5))
  86.     (setq zj (/ ht 3))
  87.     (setq n 0)
  88.     (while (= n 0)
  89. ;;;       (setq TXT (getstring "\n-->请输入文字:"))
  90. (setq TXT "操作练习");暂用固定练习
  91.      (setvar "osmode" 33)
  92.       (if (/= txt "")
  93.          (setq   p1 (getpoint "\n-->请指定点坐标:")
  94.         )
  95. )
  96.      (if (= txt "") (setq n 1)(zcx))
  97. )
  98.     (setvar "osmode" vv)
  99.     (princ)
  100. )
  101. ;;;以下是一个找来的用图元方法画多线,但不知如何在动态中更新,也请大师指点
  102. (defun HDX (pts XK)
  103.   (if (entmake
  104. (append (list '(0 . "LWPOLYLINE")
  105.         '(100 . "AcDbEntity")
  106.         '(100 . "AcDbPolyline")
  107.         (cons 90 (length pts))
  108.                       (cons 43 xk)
  109.   )
  110. (mapcar '(lambda (x) (cons 10 (trans x 1 0))) pts)
  111.   '((210 0. 0. 1.))
  112. )
  113.       )
  114.     (entlast)
  115.   )
  116. )
  117. (defun 3D->2D (p /)
  118.    (list (car p)(cadr p))
  119.    )

点评

你改的太对太好了,大师的高超技艺,热心帮助大公无私精神,是明经上真正的大师。衷心感谢你,向你致敬。  发表于 2013-1-30 09:48
发表于 2013-1-29 23:51 来自手机 | 显示全部楼层
收藏了,,,,,,,,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 11:41 , Processed in 1.131848 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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