明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: ww5w

请指点一下,可以取得多段线粗线的部分在线上的位置长度吗?

  [复制链接]
 楼主| 发表于 2013-2-1 22:43:43 | 显示全部楼层
cable2004 发表于 2013-2-1 20:30


能提供源码学习一下吗

本帖子中包含更多资源

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

x
发表于 2013-2-2 09:25:41 | 显示全部楼层

本帖子中包含更多资源

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

x
 楼主| 发表于 2013-2-2 12:04:10 | 显示全部楼层
yjr111 发表于 2013-2-2 09:25

谢谢,非常好,效果不错,
不过有时想改一下矩形的高度和离线的距离,却改不了,成固定了.
如果能改就好了.
可以指点一下怎么展线吗?线宽也不变.

点评

取得线宽用getwidth,设置线宽用setwidth  发表于 2013-2-2 17:44
发表于 2013-2-2 14:00:02 | 显示全部楼层
ww5w 发表于 2013-2-1 12:35
如果可以,展开后的线有线宽还是能显示有线宽,谢谢.


以下代码已经加入展直与写长度在那个方框里去


;取lwpoline线变宽的地方,并在上生成方框
;    xiabin68  
;    QQ:19539078
; 以下程序没有加入任何子函数希望对初学有帮助
;转载请说明出处与作者信息
(defun c:hk nil
  (setq ent (car (entsel"请选择多段线:")));选择多段线
  (setq zb (getpoint "请选择多段线展直起点:"));选择新建多段线的起点
  (setq lst (entget ent));取DXF表
  (setq dd (length lst));取表的数量
  (setq zblst '());建空表
  (setq i 0)
   (while (/= (car (nth i lst)) 10);判断每一个坐标在元素的位置
     (setq i (1+ i))
     )

(setq zblst (append zblst (list (cons 10 zb)) (list (nth (+ 1 i) lst)) (list (nth (+ 2 i) lst)) (list (nth (+ 3 i) lst))));把第一个位置加入到zblst表中去
   
  (while (= 10 (car (nth i lst))) ;重复取坐标并建表
        (setq x1 (cdr (nth i lst)));取第一个坐标
        (if (= (car (nth (+ i 4) lst)) 10);再取出下一个坐标
            (setq x2 (cdr (nth (+ i 4) lst)))
            (setq x2 nil)
          )                                 
    (if (and x1 x2)  ;如果下一个坐标不为NIL就继续运行
      (progn
        (setq dist (distance x1 x2));算出两点的直线距离
        (setq x3 (polar zb (angtof "0") dist));再以起点为原点算出下个点的新坐标
        (setq zblst (append zblst (list (cons 10 x3)) (list (nth (+ 5 i) lst)) (list (nth (+ 6 i) lst)) (list (nth (+ 7 i) lst))));再把后面的线宽一起取出加到表中去
        (setq  zb x3)
        (setq i (+ i 4))
        )
    (setq i 2)
      )
    );重复取坐标结束

  (setq zblst (append (list (assoc 0 lst) '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (assoc 90 lst)) zblst));建立多段线要素全部合并到一个表中
   (entmakex zblst);新建一个展直的多段线
  (setq aa (entlast));找到刚刚新建的多段线
  (setq lstt (entget aa))
  (setq n 0)
  (repeat (length lstt)
    (setq nn (car (nth n lstt)))
    (if (= nn 10);查看该元素是不是坐标元素
      (progn
        (setq xy (cdr (nth n lstt)));取出第一个点的坐标
        (setq high (cdr (nth (1+ n) lstt)));取出坐标后的线宽度是不是发升的变化
        (if (and xy (> high 0));是不是满足两个要求,要坐标 点,并后面的线席发生变化
          (progn
            (setq xx (cdr (nth (+ n 4) lstt)));取出下一个点的坐标
            (setq xy1 (polar  xy (angtof "90") 5));算矩形框 左下角点
            (setq xy2 (polar xx (angtof "90") 10));算矩形框 右上角点
            (setq textxy (polar xy1 (angle xy1 xy2) (/ (distance xy1 xy2) 3)));算出文字的坐标
            (setq lr (rtos (distance xy xx) 2 2));算出两点之间的长度
            (command "rectang" xy1 xy2);画矩形框
            (entmakex (list '(0 . "TEXT")  ;用文字写出长度
                              (cons 1 lr)
                             (cons 10 textxy)
                            (CONS 40 1.5)
            )
          )
        )
      )
        )
      )
    (setq n (1+ n))
    )
  )

(princ "程序加载成功输入HK运行!");加载成功 提示
          
       
       
   
          
         

点评

谢谢!,不过有个问题弧位的线没有展直,能再修正一下么..  发表于 2013-2-2 14:55

评分

参与人数 2明经币 +2 金钱 +6 收起 理由
USER2128 + 1
ww5w + 1 + 6 很给力!

查看全部评分

 楼主| 发表于 2013-2-2 14:57:25 | 显示全部楼层
xiabin68 发表于 2013-2-2 14:00
以下代码已经加入展直与写长度在那个方框里去


这是图,箭头指的地方,是弧位,展开后还是弧..

本帖子中包含更多资源

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

x
发表于 2013-2-2 19:54:37 | 显示全部楼层
ww5w 发表于 2013-2-2 14:57
这是图,箭头指的地方,是弧位,展开后还是弧..

都没有发现这个问题,,呵呵,,我看看,,,
发表于 2013-2-2 21:13:31 | 显示全部楼层
ww5w 发表于 2013-2-2 14:57
这是图,箭头指的地方,是弧位,展开后还是弧..


这下把程序优华了一下,效果见上图


本帖子中包含更多资源

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

x

评分

参与人数 1金钱 +10 收起 理由
ww5w + 10 谢谢,没得币加了.效果非常好,还多了一个标上.

查看全部评分

 楼主| 发表于 2013-2-2 21:54:03 | 显示全部楼层
谢谢xiabin68,效果非常好,还多了一个标上尺寸功能,又注释,学习了.辛苦你了!
发表于 2013-2-2 22:28:41 | 显示全部楼层
ww5w 发表于 2013-2-2 21:54
谢谢xiabin68,效果非常好,还多了一个标上尺寸功能,又注释,学习了.辛苦你了!

慢慢学吧,这个程序可以变的很精间的,,方便大家学习,没有用自定义函数,,,你试着改吧,,,
发表于 2013-5-25 22:48:10 | 显示全部楼层
xiabin68 发表于 2013-2-2 22:28
慢慢学吧,这个程序可以变的很精间的,,方便大家学习,没有用自定义函数,,,你试着改吧,,,

附上源码:
  1. (defun get_pline-vertexs (e / i v lst)
  2.   (setq i -1)
  3.   (while (setq v (vlax-curve-getpointatparam e (setq i (1+ i))))
  4.     (setq lst (cons v lst))
  5.   )
  6.   (reverse lst)
  7. )
  8. (defun makelwpline(lst)
  9.   (entmake (append (list '(0 . "LWPOLYLINE")
  10.                          '(100 . "AcDbEntity")
  11.                          '(100 . "AcDbPolyline")
  12.                          (cons 90 (length lst))
  13.                     )
  14.                     (mapcar '(lambda (pt) (cons 10 pt)) lst)
  15.             )
  16.    )
  17. )
  18. (defun drawagain(lst / p1 p2 )
  19. (if(cadr lst)
  20.   (progn
  21.    (vla-GetWidth obj n 'sw 'ew)
  22.    (setq p1(car lst)p2(cadr lst))
  23.    (if(not(=(setq sw(eval 'sw))(setq ew(eval 'ew))0.0))      
  24.     (setq reclst(cons(list p1 p2)reclst) widindex(cons (list n sw ew) widindex))
  25.    )
  26.   (setq n(1+ n))
  27.   (if(cadr lst)(drawagain(cdr lst)))
  28.   )
  29. )
  30. )
  31. (defun makenewlst(lst / px py dislst)
  32.   (setq px (caar lst) py (cadar lst))
  33.   (mapcar '(lambda(x)(setq dislst(cons(vlax-curve-getDistAtPoint obj x)dislst)))lst)
  34.   (mapcar '(lambda(x)(setq newplst(cons (list (+ x px)py)newplst)))(reverse dislst))
  35.   (setq newplst (reverse newplst))  
  36. )
  37. (defun c:tt(/ obj plst n inp newplst reclst widindex oldosm oldcol)
  38. (command "ucs" "w")
  39. (setq obj(vlax-ename->vla-object (car(entsel"\n选择多段线"))))
  40.   (if obj
  41.     (progn
  42.       (setq plst(get_pline-vertexs obj) n 0 inp(getpoint"\n展直插入点"))
  43.       (makenewlst plst)
  44.       (makelwpline newplst)
  45.       (drawagain newplst)      
  46.       (setq obj(vlax-ename->vla-object(entlast)))
  47.       (vla-move obj (vlax-3d-point(car plst))(vlax-3d-point inp))
  48.       (mapcar '(lambda(x)(apply 'vla-setwidth (cons obj x))) (reverse widindex))
  49.       (setq oldosm (getvar 'osmode))
  50.       (setq oldcol (getvar 'cecolor))
  51.       (setvar 'osmode 0)
  52.       (setvar 'cecolor "2")
  53.       (foreach x reclst
  54.         (command "rectang" (list(caar x)(+ 5(cadar x)))(list(caadr x)(+ 10(cadadr x))))
  55.         (vla-move (vlax-ename->vla-object(entlast)) (vlax-3d-point(car plst))(vlax-3d-point inp))
  56.         )
  57.       )
  58.   )
  59. (setvar 'osmode oldosm)
  60. (setvar 'cecolor oldcol)
  61. (command "ucs" "p")
  62. (princ)
  63. )
  64.       
  65.       

评分

参与人数 1明经币 +1 金钱 +5 收起 理由
ww5w + 1 + 5 很给力!

查看全部评分

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

本版积分规则

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

GMT+8, 2025-5-29 04:52 , Processed in 0.184933 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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