清风明月名字 发表于 2014-7-5 18:57:54

求多义线直线段变弧线段代码

本帖最后由 清风明月名字 于 2014-7-5 19:15 编辑


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

香田里浪人 发表于 2014-7-5 18:57:55

直线段改为弧线段,论坛里有了,抄录如下:
; 动态改变多段线直线为弧线
(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

llsheng_73 发表于 2014-7-5 23:47:59

反插件好写些,将对应子段上的凸度去掉就行了
前边的要求也好写,比反插件略难一点点的是计算凸度值,不过根据该子段的两个端点再加上弧段上的一个点进行三点计算圆心、半径、从而求出其凸度值其实也不难,只是写得要多点
页: [1]
查看完整版本: 求多义线直线段变弧线段代码