duhan6401 发表于 2024-5-5 08:13

修改线宽

各位大侠,现有一条多段线,顶点有上千个,我需要把线宽改为中间点那个位置线宽度改为100或者是我需要自定义设置的一个线宽,起点和终点都为0,中间点和起始、终点之间的线宽按照顶点个数平分100的线宽,依次变窄,最好能用lisp。比如有1200个顶点,其中0号点处线宽为0,到600处为100,1到599号点依次变宽,到600时宽度是100,601到1199又依次变窄,直到0号点时候为0。是不是有点复杂啊

yshf 发表于 2024-5-5 10:35

本帖最后由 yshf 于 2024-5-5 19:03 编辑

(defun c:xgxk()
    (vl-load-com)
    (command "_undo" "be")
    (if (setq ssa (ssget ":S" '((0 . "lwpolyline"))))
      (progn
            (setq ent (ssname ssa 0))
            (setq obj (vlax-ename->vla-object ent))
            (setq dxf (entget ent))
            (setq n (cdr (assoc 90 dxf)))
            (setq m1 (fix (/ n 2)))
            (setq m2 (- n m1))
            (if (= (setq zjkd (getreal (strcat "\n请输入中间点(第" (itoa m1) "个点)的宽度<100>="))) nil)
                (setq zjkd 100.0)
            )
            (setq i 1)
            (repeat n
                (setq j (1- i))
                (if (< i m1)
                  (progn
                        (setq dk (/ zjkd m1))
                        (setq k1 (* (1- i) dk))
                        (setq k2 (+ k1 dk))
                  )
                  (progn
                        (setq dk (/ (- zjkd) m2))
                        (setq k1 (+ zjkd (* (- i m1) dk)))
                        (setq k2 (+ k1 dk))
                  )
                )
                (vla-SetWidth obj j k1 k2)
                (setq i (1+ i))
            )
             (vla-update obj)
      )
    )
    (command "_undo" "e")
    (princ)
)

duhan6401 发表于 2024-5-5 16:10

把这句去掉(setq j (1- i)), (vla-SetWidth obj j k1 k2)这个改成 (vla-SetWidth obj i k1 k2)就刚刚好

duhan6401 发表于 2024-5-5 16:14

yshf 发表于 2024-5-5 10:35
(defun c:xgxk()
    (vl-load-com)
    (command "_undo" "be")


老大明经币到账没有啊,我不知道怎么操作已解决

yshf 发表于 2024-5-5 19:05

本帖最后由 yshf 于 2024-5-5 19:07 编辑

(setq(/ (- zjkd) m2))应为(setq dk (/ (- zjkd) m2))
把这句去掉(setq j (1- i)), (vla-SetWidth obj j k1 k2)这个改成 (vla-SetWidth obj i k1 k2)就刚刚好
会出现错误的,而且达不到要求。
页: [1]
查看完整版本: 修改线宽