明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1589|回复: 2

[提问] 求多义线直线段变弧线段代码

[复制链接]
发表于 2014-7-5 18:57 | 显示全部楼层 |阅读模式
5明经币
本帖最后由 清风明月名字 于 2014-7-5 19:15 编辑

我想求高手写一个插件,将轻多义线、二维多义线、三维多义线(只对轻多义线有效亦可)的鼠标指定的某直线段改为弧线段,这样多义线就可以和样条曲线一样可以圆滑过渡了。
它的反插件,即将多义线弧线段变直线段请朋友顺手也写一个。

最佳答案

查看完整内容

直线段改为弧线段,论坛里有了,抄录如下: ; 动态改变多段线直线为弧线 (defun C:dtgh (/ A1 ENT GR I LST LW PAR PT) (vl-load-com) (vla-StartUndoMark (vla-get-activedocument (vlax-get-acad-object))) (setq lw (entsel "\n 选择多段线所需的段 ")) (if (and lw (= (cdr (assoc 0 (entget (car lw)))) "LWPOLYLINE")) (progn (setq par (vlax-curve-getParamAtPoint (car lw) ...
发表于 2014-7-5 18:57 | 显示全部楼层
直线段改为弧线段,论坛里有了,抄录如下:
; 动态改变多段线直线为弧线
(defun C:dtgh (/ A1 ENT GR I LST LW PAR PT)
  (vl-load-com)
  (vla-StartUndoMark (vla-get-activedocument (vlax-get-acad-object)))
  (setq lw (entsel "\n 选择多段线所需的段 "))
  (if (and lw (= (cdr (assoc 0 (entget (car lw)))) "LWPOLYLINE"))
    (progn (setq par (vlax-curve-getParamAtPoint (car lw)
                                                 (vlax-curve-getClosestPointTo (car lw) (cadr lw))
                     ) ;_  vlax-curve-getParamAtPoint
                 a1  (angle (vlax-curve-getPointAtParam (car lw) (fix par))
                            (vlax-curve-getPointAtParam (car lw) (1+ (fix par)))
                     ) ;_  angle
           ) ;_  setq
           (princ "\n 设定所需的弧度 ")
           (while (and (setq gr (grread 5)) (= (car gr) 5))
             (setq i   0
                   lst nil
                   ent (entget (car lw))
             ) ;_  setq
             (while (or (/= (caar ent) 42)
                        (if (< i (fix par))
                          (setq i (1+ i))
                        ) ;_  if
                    ) ;_  or
               (setq lst (cons (car ent) lst)
                     ent (cdr ent)
               ) ;_  setq
             ) ;_  while
             (redraw)
             (grdraw (setq pt (vlax-curve-getPointAtParam
                                (car lw)
                                (fix par)
                              ) ;_  vlax-curve-getPointAtParam
                     ) ;_  setq
                     (cadr gr)
                     6
                     1
             ) ;_  grdraw
             (entmod (append (reverse (cons (cons 42
                                                  (/ (sin (/ (- a1 (angle pt (cadr gr))) 2.))
                                                     (cos (/ (- a1 (angle pt (cadr gr))) 2.))
                                                  ) ;_  /
                                            ) ;_  cons
                                            lst
                                      ) ;_  cons
                             ) ;_  reverse
                             (cdr ent)
                     ) ;_  append
             ) ;_  entmod
             (entupd (car lw))
           ) ;_  while
    ) ;_  progn
    (princ "\n It is selected nothing or plant not a polyline. ")
  ) ;_  if
  (vla-EndUndoMark (vla-get-activedocument (vlax-get-acad-object)))
  (redraw)
  (princ)
) ;_  defun

点评

谢谢您的热心!  发表于 2014-7-6 08:07

评分

参与人数 1明经币 +1 收起 理由
清风明月名字 + 1 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2014-7-5 23:47 | 显示全部楼层
反插件好写些,将对应子段上的凸度去掉就行了
前边的要求也好写,比反插件略难一点点的是计算凸度值,不过根据该子段的两个端点再加上弧段上的一个点进行三点计算圆心、半径、从而求出其凸度值其实也不难,只是写得要多点
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 15:01 , Processed in 0.196659 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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