明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1849|回复: 3

求MLINE线转PLINE线[已解决]

[复制链接]
发表于 2012-12-26 20:08 | 显示全部楼层 |阅读模式
本帖最后由 weiqi 于 2013-1-19 20:39 编辑

问题解决,虽然代码丑陋~~附件,为PL线加ML线~和 ML线加PL线



--------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------




本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2013-1-18 20:58 | 显示全部楼层
本帖最后由 weiqi 于 2013-1-18 20:59 编辑

找到一个G版的 ML线转直线
  1. ;|5.【非图形对象操作】20分
  2.    在禁用炸开命令的前提下,将将MLINE转换为LINE。
  3.    |;
  4. ;;
  5. ;; Copyright (c)2011.12.31 Gu_xl
  6. ;; 版权所有  Gu_xl
  7. ;;
  8. ;;作者保留本程序的一切权利,但你可以自由拷贝与复制、修改本程序用于非商业目的。
  9. ;;作者尽力将本程序做得完善,但不会因本软件的错失而造成的损失承担任何责任。
  10. ;;本程序仅提供作为应用上的参考, 而未声明或隐含任何保证; 对于任何特殊用途之适
  11. ;;应性, 以及商业销售所隐含作出的保证, 在此一概予以否认。
  12. ;;
  13. (vl-load-com)
  14. ;;;*************函数 gxl-codestrip.lsp  *************
  15. ;; | ---------------------------------------------------------------------------
  16. ;; | (gxl-CodeStrip entl StripLst) 将entl表 剔除StripLst表中的组码值
  17. ;;;(gxl-CodeStrip (entget (car(entsel))) (list 330 -1 5 8 70 100 10))
  18. (defun gxl-CodeStrip( entl StripLst)
  19. (vl-remove-if '(lambda ( a ) (vl-position (car a) StripLst)) entl)
  20. )
  21. ;;;***************** 函数 gxl-CodeStrip*****************

  22. ;;;*************函数 gxl-listmlstyle.lsp  *************
  23. ;;;打印多样式数据表
  24. ;;;(gxl-listmlstyle "Standard")
  25. (defun gxl-listmlstyle (name / mltable ent flag)
  26.   (setq mltable (dictsearch (namedobjdict) "ACAD_MLINESTYLE")
  27. flag t)
  28.   (while (and flag mltable)
  29.     (setq data (car mltable)
  30.    mltable (cdr mltable)
  31.    )
  32.     (if (= 3 (car data))
  33.       (if (= (strcase name) (strcase (cdr data)))
  34. (setq flag nil
  35.        ent (cdar mltable)
  36.        )
  37. )
  38.       )
  39.     )
  40.   (if ent
  41.     (progn
  42.     (setq ent (entget ent))
  43.     (GXL-CODESTRIP ent (list -1 5 102 330))
  44.     )
  45.     )
  46.   )
  47. ;;;***************** 函数 gxl-listmlstyle*****************

  48. ;;;*************函数 gxl-listp.lsp  *************
  49. ;;;(gxl-listp lst) 判断表是否为真正的表,非nil、非点对表
  50. ;;;(gxl-listp nil) nil (gxl-listp '(1 . 2)) (gxl-listp '(1  2))
  51. (defun gxl-listp (lst)
  52.   (and (vl-consp lst)
  53.        (vl-list-length lst)
  54.        )
  55.   )
  56. ;;;***************** 函数 gxl-listp*****************

  57. ;;;*************函数 gxl-dxf.lsp  *************
  58. (defun gxl-dxf (ent i)
  59.   (if (= (type ent) 'ename)
  60.     (setq ent (entget ent '("*")))
  61.     )
  62.   (cond ((atom i)
  63.   (cdr (assoc i ent))
  64.   )
  65. ((gxl-listp i)
  66.   (mapcar '(lambda (x) (cdr (assoc x ent))) i)
  67.   )
  68. )
  69.   )
  70. ;;;***************** 函数 gxl-dxf*****************

  71. ;;;*************函数 gxl-midpoint.lsp  *************
  72. ;;;==================================================================
  73. ;;;gxl-MidPoint 表操作函数,计算两点的中点
  74. ;;;计算两点的中点
  75. ;;;==================================================================
  76. (defun gxl-MidPoint (p1 p2)
  77.   (if (and (> (length p1) 2)(> (length p2) 2))
  78.       (list (* 0.5 (+ (car p1) (car p2))) (* 0.5 (+ (cadr p1) (cadr p2))) (* 0.5 (+ (caddr p1) (caddr p2))))
  79.       (list (* 0.5 (+ (car p1) (car p2))) (* 0.5 (+ (cadr p1) (cadr p2))))
  80.   )  
  81.   )
  82. ;;;***************** 函数 gxl-MidPoint*****************

  83. ;;;*************函数 gxl-sel-entnextall.lsp  *************
  84. ;;;gxl-Sel-EntNextAll en 返回 en 之后的所有物体选择集,无则返回 nil,en为nil返回图形全部图元
  85. (defun gxl-Sel-EntNextAll (ent / ss)
  86.   (if (not ent)
  87.     (progn
  88.       (setq ent (entnext))
  89.     (if ent
  90.       (setq ss (ssadd ent))
  91.       (setq ss (ssadd))
  92.       )
  93.   )
  94.     (setq ss (ssadd))
  95.     )
  96.   (while (setq ent (entnext ent))
  97.     (if (not (member (cdr (assoc 0 (entget ent))) '("ATTRIB" "VERTEX" "SEQEND")))
  98.       (ssadd ent ss)
  99.       )
  100.     )
  101.   (if (= 0 (sslength ss))
  102.     nil
  103.     ss
  104.     )
  105.   )
  106. ;;;***************** 函数 gxl-Sel-EntNextAll*****************
  107. ;;;(gxl-Sel-Mapcar ss Fun) 遍历选择集对所包含的图元进行指定函数操作,返回操作后的表
  108. (defun gxl-Sel-Mapcar (ss Fun / nn rtn)
  109.   (if ss
  110.   (repeat (setq nn (sslength ss))
  111.   (setq rtn (cons (apply Fun (list (ssname ss (setq nn (1- nn))))) rtn))
  112.     )
  113.     )
  114.   )

  115. ;;;*************************************************
  116. ;| 参数:mldata 多线样式组码表
  117. (setq mldata '((0 . "MLINESTYLE")
  118.      (100 . "AcDbMlineStyle")
  119.      (2 . "A0")                ;_ 多线样式名
  120.      (70 . 1634)               ;_ 70 标志(按位编码):
  121.           ;_ 1 =填充
  122.           ;_ 2 = 显示斜接
  123.           ;_ 16 = 开始矩形结束(直线)封口
  124.           ;_ 32 = 开始内弧封口
  125.           ;_ 64 = 开始圆(外弧)封口
  126.           ;_ 256 = 结束矩形(直线)封口
  127.           ;_ 512 = 结束内弧封口
  128.           ;_ 1024 = 结束圆(外弧)封口
  129.      (3 . "")                  ;_ 样式说明(字符串,最多为 255 个字符)
  130.      (62 . 0)                  ;_ 填充颜色(整数,默认值 = 256)
  131.      (51 . 1.5708)             ;_ 起点角度(实数,默认值为 90 度)
  132.      (52 . 1.5708)             ;_端点角度(实数,默认值为 90 度
  133.      (71 . 2)         ;_ 元素数
  134.      (49 . 0.5)                ;_ 元素偏移(实数,无默认值)。可以存在多个条目;每个元素一个条目
  135.      (62 . 256)                ;_ 元素颜色(整数,默认值 = 0)。可以存在多个条目;每个元素一个条目
  136.      (6 . "权界线共有")        ;_ 元素线型(字符串,默认值 = 随层)。可以存在多个条目;每个元素一个条目
  137.      (49 . -0.5)               ;_ 元素偏移(实数,无默认值)。可以存在多个条目;每个元素一个条目
  138.      (62 . 256)                ;_ 元素颜色(整数,默认值 = 0)。可以存在多个条目;每个元素一个条目
  139.      (6 . "权界线共有")        ;_ 元素线型(字符串,默认值 = 随层)。可以存在多个条目;每个元素一个条目
  140.    )
  141. )
  142. |;
  143. ;;;(gxl-ml2line mline) 多线转直线
  144. ;;;(gxl-ml2line (car(entsel)))
  145. (defun gxl-ml2line (MLINE /  MAKELINE  MAKEARC   MLDATA
  146.          MLTYPEDATA    DXF70     LINETYPES
  147.          COLORS  DISPLAYJIONS      SCALE
  148.          ALIGN  CLOSEDP   LAYER     BASEPT
  149.          ANG1  ANG2    STARTANG  NEWPTS
  150.          NUM  PTS    PT      P1
  151.          P2  MP    N      K
  152.          NODEPTS  NEXTNODE  OLDPTS    STPTS
  153.          ENDANG  ENDPTS    TMPPT     TMPCOLORS
  154.          TMPLTYPES LOOP    CP EndEntity
  155.         )  
  156.   (defun makeline (p1 p2 Ltype layer color)
  157.     (entmake
  158.       (list '(0 . "line")
  159.      (cons 8 layer)
  160.      (cons 62 color)
  161.      (cons 6 ltype)
  162.      (cons 10 p1)
  163.      (cons 11 p2)
  164.      )
  165.       )
  166.     (entlast)
  167.     )
  168.   (defun makeArc (cp p1 p2 Ltype layer color)
  169.     (entmake
  170.       (list '(0 . "arc")
  171.      (cons 8 layer)
  172.      (cons 62 color)
  173.      (cons 6 ltype)
  174.      (cons 10 cp)
  175.      (cons 40 (distance cp p1))
  176.      (cons 50 (angle cp p1))
  177.      (cons 51 (angle cp p2))
  178.       )
  179.     )
  180.   )
  181.   (setq EndEntity (entlast))
  182.   (setq mldata (entget mline))
  183.   (setq Mltypedata (gxl-listmlstyle (gxl-dxf mline 2))) ;_ 多线样式表
  184.   (setq dxf70 (gxl-dxf Mltypedata 70))
  185.   (setq LineTypes (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= 6 (car x))) Mltypedata))) ;_ 线型表
  186.   (setq Colors (cdr (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= 62 (car x))) Mltypedata)))) ;_颜色表
  187.   (setq DisPlayJions (= 2 (logand dxf70 2))) ;_ 2 = 显示斜接
  188.   (setq scale (gxl-dxf mline 40) ;_ 比例因子
  189. align (gxl-dxf mline 40) ;_ 对正:0 = 上;1 = 无;2 = 下
  190. closedp  (= 2 (logand (gxl-dxf mline 71) 2)) ;_ 是否闭合
  191. layer (gxl-dxf mline 8)
  192. )
  193.   (setq mldata (member (assoc 11 mldata) mldata))
  194.   (while (= (caar mldata) 11) ;_ 一个线段开始
  195.     (setq basept (gxl-dxf mldata 11) ;_ 顶点
  196.    ang1 (angle '(0 0 0) (gxl-dxf mldata 12)) ;_ 从该顶点开始的线段的方向角度
  197.    ang2 (angle '(0 0 0) (gxl-dxf mldata 13)) ;_ 此顶点处的斜接方向角度
  198.    mldata (cdddr mldata)
  199.    )
  200.     (if (null StartAng)(setq StartAng ang1)) ;_ 储存起点直线方向
  201.     (setq NewPts nil)
  202.     (while (= 74 (caar mldata)) ;_ 一个顶点开始
  203.        (setq Num    (cdar mldata) ;_ 元素的参数数目
  204.       mldata (cdr mldata)
  205.       pts nil ;_ 直线段点清空
  206.        )
  207.       (setq pt (polar basept ang2 (cdar mldata)) ;_ 斜接方向点
  208.         mldata (cdr mldata)
  209.         pt (polar pt ang1 (cdar mldata)) ;_ 直线方向点
  210.         mldata (cdr mldata)
  211.         )
  212.       (setq pts (cons pt pts))
  213.       (repeat (- num 2) ;_ 含打断点
  214. (setq pts (cons (polar pt ang1 (cdar mldata)) pts)
  215.        mldata (cdr mldata)
  216.        )
  217. )
  218.       (setq mldata (cdr mldata)
  219.      pts    (reverse pts) ;_ 一条直线段点
  220.      NewPts (cons pts NewPts)
  221.       )

  222.       )
  223.     (setq NewPts (reverse NewPts))
  224.     (if DisPlayJions ;_ 显示斜接
  225.       (progn
  226. (setq p1 (caar NewPts)
  227.        p2 (car (last NewPts))
  228.        mp (GXL-MIDPOINT p1 p2)
  229.        )
  230.    (makeline p1 mp (car LineTypes) layer (car colors))
  231.    (makeline  mp p2 (last LineTypes) layer (last colors))
  232. )
  233.    )
  234.     (if oldPts
  235.       (progn

  236. (setq n 0 k 0)
  237. (repeat (length oldpts)
  238.    (setq NodePts  (nth n oldpts) ;_ 上一直线结点坐标
  239.   nextNode (car (nth n NewPts)) ;_ 本段直线起点
  240.   n (1+ n)
  241.    )
  242.    (setq NodePts (append NodePts (list nextNode)))
  243.    (makeline (car NodePts) (cadr NodePts) (nth k LineTypes) layer (nth k colors)) ;_ 划线
  244.    (setq NodePts (cddr NodePts))
  245.    (while NodePts
  246.      (makeline (car NodePts) (cadr NodePts) (nth k LineTypes) layer (nth k colors)) ;_ 划线
  247.      (setq NodePts (cddr NodePts))
  248.    )
  249.    (setq k (1+ k))
  250.      )
  251.    (setq oldPts NewPts)
  252. )
  253.       (setq oldPts NewPts
  254.      stpts (mapcar 'car NewPts) ;_ 保存起始结点点
  255.      )
  256.       )

  257.     )
  258.   (setq EndAng ang1) ;_ 储存终点直线方向
  259.   (setq endpts(mapcar 'car NewPts)) ;_ 保存起始结点
  260.   (if closedp
  261.     (progn

  262.       (apply 'mapcar (list 'makeline stpts endpts LineTypes (mapcar '(lambda(x) layer) stpts) colors)) ;_ 绘制闭合线
  263.       )
  264.     (progn
  265.       (if (not DisPlayJions) ;_ 不显示斜接
  266. (progn
  267.       (if (= 16 (logand dxf70 16)) ;_ 16 = 开始矩形结束(直线)封口
  268. (progn
  269.    (if (> (length stpts) 1)
  270.      (progn
  271.        (makeline (car stpts) (last stpts) "BYLAYER" layer 256)
  272.        )
  273.      )
  274.    )
  275. )
  276.       (if (= 256 (logand dxf70 256)) ;_ 256 = 结束矩形(直线)封口
  277. (progn
  278.    (if (> (length endpts) 1)
  279.      (progn
  280.        (makeline (car endpts) (last endpts) "BYLAYER" layer 256)
  281.        )
  282.      )
  283.    )
  284. )
  285.       )
  286. )
  287.       (if (= 64 (logand dxf70 64)) ;_ 64 = 开始圆(外弧)封口
  288. (progn
  289.    (setq tmppt stpts tmpcolors colors tmpltypes LineTypes)
  290.    (setq p1 (car tmppt) ;_ 弧端点
  291.       p2 (last tmppt) ;_ 弧端点
  292.       cp (GXL-MIDPOINT p1 p2) ;_ 圆心点
  293.       mp (polar cp StartAng (- (distance cp p1))) ;_ 圆弧中点
  294.       )
  295.        (makeArc cp p1 mp (car tmpltypes) layer (car tmpcolors))
  296.        (makeArc cp  mp p2 (car tmpltypes) layer (last tmpcolors))
  297.    )
  298. )
  299.       (if (= 32 (logand dxf70 32)) ;_ 32 = 开始内弧封口
  300. (progn
  301.    (setq tmppt stpts tmpcolors colors tmpltypes LineTypes)
  302.    (setq tmppt (reverse (cdr (reverse (cdr tmppt)))))
  303.      (setq tmpcolors (reverse (cdr (reverse (cdr tmpcolors)))))
  304.      (setq tmpltypes (reverse (cdr (reverse (cdr tmpltypes)))))
  305.    (while (> (length tmppt) 1)
  306.        (setq p1 (car tmppt) ;_ 弧端点
  307.       p2 (last tmppt) ;_ 弧端点
  308.       cp (GXL-MIDPOINT p1 p2) ;_ 圆心点
  309.       mp (polar cp StartAng (- (distance cp p1))) ;_ 圆弧中点
  310.       )
  311.        (makeArc cp p1 mp (car tmpltypes) layer (car tmpcolors))
  312.        (makeArc cp  mp p2 (car tmpltypes) layer (last tmpcolors))
  313.      (setq tmppt (reverse (cdr (reverse (cdr tmppt)))))
  314.      (setq tmpcolors (reverse (cdr (reverse (cdr tmpcolors)))))
  315.      (setq tmpltypes (reverse (cdr (reverse (cdr tmpltypes)))))
  316.      )
  317.    )
  318. )

  319.       (if (= 1024 (logand dxf70 1024)) ;_ 1024 = 结束圆(外弧)封口
  320. (progn
  321.    (setq tmppt endpts tmpcolors colors tmpltypes LineTypes)
  322.    (setq p1 (car tmppt) ;_ 弧端点
  323.       p2 (last tmppt) ;_ 弧端点
  324.       cp (GXL-MIDPOINT p1 p2) ;_ 圆心点
  325.       mp (polar cp EndAng (distance cp p1)) ;_ 圆弧中点
  326.       )
  327.        (makeArc cp  mp p1 (car tmpltypes) layer (car tmpcolors))
  328.        (makeArc cp  p2 mp  (car tmpltypes) layer (last tmpcolors))
  329.    )
  330. )
  331.       (if (= 512 (logand dxf70 512)) ;_ 512 = 结束内弧封口
  332. (progn
  333.    (setq tmppt endpts tmpcolors colors tmpltypes LineTypes)
  334.    (setq tmppt (reverse (cdr (reverse (cdr tmppt)))))
  335.      (setq tmpcolors (reverse (cdr (reverse (cdr tmpcolors)))))
  336.      (setq tmpltypes (reverse (cdr (reverse (cdr tmpltypes)))))
  337.    (while (> (length tmppt) 1)
  338.        (setq p1 (car tmppt) ;_ 弧端点
  339.       p2 (last tmppt) ;_ 弧端点
  340.       cp (GXL-MIDPOINT p1 p2) ;_ 圆心点
  341.       mp (polar cp EndAng (distance cp p1)) ;_ 圆弧中点
  342.       )
  343.        (makeArc cp  mp p1 (car tmpltypes) layer (car tmpcolors))
  344.        (makeArc cp  p2 mp  (car tmpltypes) layer (last tmpcolors))
  345.      (setq tmppt (reverse (cdr (reverse (cdr tmppt)))))
  346.      (setq tmpcolors (reverse (cdr (reverse (cdr tmpcolors)))))
  347.      (setq tmpltypes (reverse (cdr (reverse (cdr tmpltypes)))))
  348.      )
  349.    )
  350. )
  351.       )
  352.     )
  353.   (entdel mline) ;_ 删除多线
  354.   (GXL-SEL-ENTNEXTALL EndEntity) ;_ 返回选择直线集
  355.   )
  356. (defun c:tt5 ()
  357.   (princ "\n***多线转直线,请选择多线: ")
  358.   (setq ss (ssget ":L" '((0 . "mline"))))
  359.   (GXL-SEL-MAPCAR ss 'GXL-ML2LINE)
  360.   (princ)
  361.   )

 楼主| 发表于 2013-1-19 00:40 | 显示全部楼层
  1. (defun c:xxx()
  2. (setq zm (entget(entlast))) ;;获取组码
  3. (setq zmcd (length zm));;获取组码
  4. (print zmcd)
  5. (while (assoc 11 zm)  
  6. (setq p0 (cdr(assoc 11 zm)))
  7. (print p0)
  8.   (setq  zm  (cdr (member (assoc 11 zm) zm)))

  9.   (command "pline" p0 (cdr(assoc 11 zm)) "")
  10. )

  11. (print )
  12. )





错误一堆~~~。

每次获得的点,P0 怎么组成 一个表噢。。。

我在WHILE 中 用(SETQ jd (list jd P0))不行噢。。

cons append 貌似也性行噢?


得 怎么写呢

本帖子中包含更多资源

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

x
 楼主| 发表于 2013-1-19 00:58 | 显示全部楼层
本帖最后由 weiqi 于 2013-1-19 02:34 编辑

终于 研究出来了。(setq jd (append (list p0) jd))

jd为每次的集合,
P0为每次获得的点~~~

得到顶点集 格式为~

((2719.53 870.875 0.0) (2163.59 246.162 0.0) (1869.03 746.76 0.0))

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-5-7 23:08 , Processed in 0.246549 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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