找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5448|回复: 16

[求助] 样条曲线转圆弧

[复制链接]

已领礼包: 28个

财富等级: 恭喜发财

发表于 2017-7-18 11:43:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
各位大神好,因为从犀牛里转出来的圆、圆弧都变成了样条曲线,所以简单的写了个样条曲线转圆、圆弧的小程序,可是在运行过程中发现转圆弧的时候很多劣弧转化成了与之对应的优弧,请各位帮我看看怎么解决,谢谢。
snipaste20170718_113719.jpg
附测试文件
请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:test.zip 
下载次数:18  文件大小:33.32 KB 
下载权限: 不限 以上  [免费赚D豆]



(defun C:tt ()
  (setvar "cmdecho" 0)
  (command ".undo" "be")
  (setq os (getvar "osmode"))
  (setvar "osmode" 0)
  (VL-LOAD-COM)
  (setq ss (ssget '((0 . "spline"))))
  (setq i 0)
    (repeat (sslength ss)
    (progn     (setq ssn (ssname ss i))
           (setq ent (entget ssn))
           (setq entobj (vlax-ename->vla-object ssn))
           (setq pt1 (vlax-curve-getstartpoint entobj))
           (setq pt2 (vlax-curve-getendpoint entobj))
           (setq stparameter (vlax-curve-getStartParam entobj))
           (setq endparameter  (vlax-curve-getEndParam entobj))
           (setq splmid (vlax-curve-getPointAtParam entobj  ( / (- endparameter  stparameter) 2)) )
           (setq splmid4 (vlax-curve-getPointAtParam entobj  ( / (- endparameter  stparameter) 4)) )
           (if (= (vla-get-Closed entobj) :vlax-true)
                 (command "_circle" "3p" pt1 splmid splmid4)
                 (command "_arc" pt1 splmid pt2)
             )                         
           (setq newa (entlast))
           (setq entobj1 (vlax-ename->vla-object newa))
           (vla-put-layer entobj1 (vla-get-layer entobj))
           (vla-put-linetype entobj1 (vla-get-linetype entobj))
           (vla-put-linetypescale entobj1 (vla-get-linetypescale entobj))
           (vla-put-color entobj1 (vla-get-color entobj))
    )
    (setq i (1+ i))
  )
  (command "erase" ss "")
  (setvar "osmode" os)
  (command ".undo" "e")
  (setvar "cmdecho" 1)
  (princ)
)

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 19个

财富等级: 恭喜发财

发表于 2017-7-18 11:46:25 | 显示全部楼层
论坛看到过现成的,你用 样条曲线 或者 SPLINE 搜索下论坛看看。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2017-7-18 11:47:15 | 显示全部楼层
(command "_arc" pt1 splmid pt2)起点和终点调一下呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2017-7-18 11:49:55 | 显示全部楼层

不行,我测试了一下,分析可能是(setq splmid (vlax-curve-getPointAtParam entobj  ( / (- endparameter  stparameter) 2)) )这里取的点不对,或者说中点参数取的是反的。但是我不会纠正它。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-7-18 11:53:08 | 显示全部楼层
1、圆弧永远是逆时针的
2、出现你的情况,肯定是起始角和终止角反了,你要判断下。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2017-7-18 11:56:38 | 显示全部楼层

逆时针。。我好好想想
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-7-18 12:03:04 | 显示全部楼层

论坛有 逆时针 判断代码,写好后希望把代码传上来和大家分享下。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-7-18 12:06:21 | 显示全部楼层

1、通过曲线长度是否小于周长一半,判断优弧、劣弧
2、角度都格式化到0-2PI,
3、判断起点、中间点,端点的时针方向,如果是顺时针,你就把起始角和终止角互换。确保逆时针,然后生成弧线。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2017-7-18 12:08:47 | 显示全部楼层

好,我查一下整理好发上来
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2017-7-18 14:15:14 | 显示全部楼层
本帖最后由 Linhay 于 2017-7-18 15:20 编辑

谢谢大家指点
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2017-7-18 15:58:45 | 显示全部楼层

研究了一下午,还是不行,逐一分析了,还是觉得(setq splmid (vlax-curve-getPointAtParam entobj  ( / (- endparameter  stparameter) 2)) )这个取得的中点是错误的,不知道怎么解决了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2017-7-18 16:27:07 | 显示全部楼层
研究了一下午,始终认为(setq splmid (vlax-curve-getPointAtParam entobj  ( / (- endparameter  stparameter) 2)) )取样条曲线中点是有问题的,换了另外一种方法解决。借用了lisphk、marting的函数和黄工的EntmakeArc,在此谢过。

(defun C:tt ()
  (setvar "cmdecho" 0)
  (command ".undo" "be")
  (setq os (getvar "osmode"))
  (setvar "osmode" 0)
  (VL-LOAD-COM)
  (setq ss (ssget '((0 . "spline"))))
  (setq i 0)
  (repeat (sslength ss)
    (progn
      (setq ssn (ssname ss i))
      (setq ent (entget ssn))
      (setq entobj (vlax-ename->vla-object ssn))
       (setq entobjlength (_getcurvelength entobj))
      (setq pt1 (vlax-curve-getstartpoint entobj))
      (setq pt2 (vlax-curve-getendpoint entobj))
      (setq stparameter (vlax-curve-getStartParam entobj))
      (setq endparameter (vlax-curve-getEndParam entobj))
      (setq splmidtt (vlax-curve-getpointatdist entobj (/ entobjlength 2)))
      (setq splmid (vlax-curve-getPointAtParam
                     entobj
                     (/ (- endparameter stparameter) 2)
                   )
      )
      (setq splmid4 (vlax-curve-getPointAtParam
                      entobj
                      (/ (- endparameter stparameter) 4)
                    )
      )
      (cond ((= (vla-get-Closed entobj) :vlax-true)
             (command "_circle" "3p" pt1 splmid splmid4)
            )
            (t
             (command "_arc" pt1 splmidtt pt2)
             (setq arctemp (entlast))
             (setq cparctemp (cdr (assoc 10 (entget arctemp))))
             (setq Rarctemp (cdr (assoc 40 (entget arctemp))))
             (setq ang1 (angle cparctemp pt1))
             (setq ang2 (angle cparctemp pt2))
             (setq splptlist (list pt1 splmidtt pt2))
             (if (= (pdc splptlist) 0)
               (EntmakeArc cparctemp Rarctemp ang1 ang2)
               (EntmakeArc cparctemp Rarctemp ang2 ang1)
             )
             (command "erase" arctemp "")
            )
      )
      (setq newa (entlast))
      (setq entobj1 (vlax-ename->vla-object newa))
      (vla-put-layer entobj1 (vla-get-layer entobj))
      (vla-put-linetype entobj1 (vla-get-linetype entobj))
      (vla-put-linetypescale
        entobj1
        (vla-get-linetypescale entobj)
      )
      (vla-put-color entobj1 (vla-get-color entobj))

    )
    (setq i (1+ i))
  )
  (command "erase" ss "")
  (setvar "osmode" os)
  (command ".undo" "e")
  (setvar "cmdecho" 1)
  (princ)
)


(defun EntmakeArc (pt r ang1 ang2)
  (entmakeX
    (list '(0 . "ARC")
          (cons 10 pt)
          (cons 40 r)
          (cons 50 ang1)
          (cons 51 ang2)
    )
  )
)

                                        ;计算PT1-PT2的测量方位角
(defun zfwj (pt1 pt2 / ang1)
  (setq ang1 (angle pt1 pt2))
  (cond
    ((<= ang1 (* 0.5 pi))
     (- (* 0.5 pi) ang1)
    )
    (t
     (- (* 2.5 pi) ang1)
    )
  )
)

                                        ;判断点序列是顺时针还是逆时针
                                        ;1为顺时针,0为逆时针
                                        ;搜索最西面的点,比较其与相邻两点的方位,判

断是顺时针还是逆时针
                                        ;暂未考虑重复点、回头线2010.09.28
(defun pdc (l1 / i j x pt1 pt2 pt3 pt4 ang1 ang2)
  (setq        j 0
        i 0
        x (car (nth 0 l1))
  )
  (repeat (1- (length l1))
    (if        (< (car (nth (1+ j) l1)) x)
      (setq i (1+ j)
            x (car (nth (1+ j) l1))
      )
    )
    (setq j (1+ j))
  )

                                        ;第i点为最西侧的点
  (cond
    ((= i 0)
     (setq pt1 (last l1)
           pt2 (nth 0 l1)
           pt3 (nth 1 l1)
     )
    )
    ((= i (1- (length l1)))
     (setq pt1 (nth (1- i) l1)
           pt2 (nth i l1)
           pt3 (car l1)
     )
    )
    (t
     (setq pt1 (nth (1- i) l1)
           pt2 (nth i l1)
           pt3 (nth (1+ i) l1)
     )
    )
  )

  (setq        ang1 (zfwj pt2 pt1)
        ang2 (zfwj pt2 pt3)
  )

  (if (< ang1 ang2)
    (progn
                                        ;(princ "NSZ")
      0
    )
    (progn
                                        ;(princ "SSZ")
      1
    )
  )
                                        ;(princ "\n")
                                        ;(princ (itoa i))
)

(defun _getcurvelength (ent / par)
  (if (not (vl-catch-all-error-p (setq par (vl-catch-all-apply 'vlax-curve-getendparam
                                                               (list ent)
                                           )
                                 )
           )
      )
    (vlax-curve-getdistatparam ent par)
  )
)


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-7-18 16:43:32 | 显示全部楼层
本帖最后由 newer 于 2017-7-18 16:45 编辑
(setq splmid (vlax-curve-getPointAtParam entobj  ( / (- endparameter  stparameter) 2)) )

取中点是 参数相加除以2,不是相减。

比如取参数1和参数3之间的中点,中点参数应该是 (/ (+ 1 3) 2.0) = 2.0,肯定不是 (/ (- 3 1) 2.0) = 1.0, 你要相减做,那你的起点就变成中间的点了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2017-7-18 16:54:22 | 显示全部楼层

抱抱。。谢谢大哥,我照教科书抄的,没想到它说的不对。再次感谢,真的困扰我好几天了
snipaste20170718_165100.jpg
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3031个

财富等级: 富可敌国

发表于 2017-7-18 17:23:11 来自手机 | 显示全部楼层
用express tools 的指令:flatten就可以了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-24 04:22 , Processed in 0.444863 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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