明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4747|回复: 18

求程序:等高线高程值取整

  [复制链接]
发表于 2011-1-26 00:02:48 | 显示全部楼层 |阅读模式
前几天发过类似的一个贴,可能没把问题说清,帖子一直没人回答,在此再说明一下,地形图中的等高线根据需要做了move + rotate + scale 的动作后,图中所有的高程值都发生了变化,等高线出现了小数位。  如:1048.012    1045.965 ,按道理这些都应该是整米数。我请高手们帮我解决这个困扰我多时的问题。我的想法是这样的,利用取整函数 fix  或 round 取整。为了更好说明问题附上一份问题样图。   这里的高手不少,希望能帮我解决,期待中。。。。。。

本帖子中包含更多资源

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

x
发表于 2022-8-29 13:46:58 | 显示全部楼层
461045462 发表于 2011-2-9 23:01
我将样图的高程值改了后,放在同事的电脑上,cass8.0下运行也是不行,不知是为什么?
我现在将改了的样图 ...

;;自己加个循环吧
(vl-load-com)
(defun c:tt ()
  (princ "功能:等高线高程值取整")
  (setq ss (ssget))
  (setq ent (ssname ss 0))
  (setq obj (vlax-ename->vla-object ent))
  (setq zgc (itoa (fix (vla-get-Elevation obj))))
  (setq ssv (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))))
  (vlax-for obj ssv (vlax-put obj 'Elevation zgc))
  (princ)
)

;这个好像可以了。
(defun c:tt6 ()
  (princ "功能:等高线高程值取整")
  (setq ss (ssget "X" (list (cons 8 "dgx") (cons 0 "LWPOLYLINE"))))
  ;(setq ss (ssget))
  (if ss
    (progn
      (setq ss4 (sslength ss))
      (setq n 0)
      (while (/= ss4 n)
             (setq en (ssname ss n))
             (setq end (entget en))
             (setq a (cdr (assoc 38 end)) adata end)
             (setq b (rtos a 2 0))
             (setq adata (subst (cons 38 (atoi b)) (assoc 38 adata) adata))
             (entmod adata)
             (setq n (+ n 1))
      )
    )
  )
  (princ)
)


改成这样TT也可以,TT6也可以
回复 支持 1 反对 0

使用道具 举报

发表于 2011-1-26 15:02:23 | 显示全部楼层
;;;自己加个循环吧

(defun c:tt ()
  (princ "功能:等高线高程值取整")
  (setq ss (ssget))
  (setq ent (ssname ss 0))
  (setq obj (vlax-ename->vla-object ent))
  (setq zgc (itoa (fix (vla-get-Elevation obj))))
  (setq ssv (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))))
  (vlax-for obj ssv (vlax-put obj 'Elevation zgc))
  (princ)
)
 楼主| 发表于 2011-1-26 23:29:52 | 显示全部楼层
我对编程不懂,对lsp语言一知半解,循环语句我没加上,就试着加载运行了一下,提示; 错误 :no function definition: VLAX-ENAME->VLA-OBJECT,我在程序的开头加了一句(vl-load-com) 后就能运行了,由于循环没有加,单选一根线结果是对的,多选就不对了,同时我发现都是截掉尾数取整了,如果我的图中还有需要进位取整的线,比如:1045.965 、1043.892又该如何呢,我的等高距是2米的,请你再帮我解决一下。谢谢了!!!!!!
发表于 2011-1-27 09:10:42 | 显示全部楼层
^_^ 我也是对编程不懂,对lsp语言也是一知半解,我试试再弄下 ^_^
发表于 2011-1-27 09:31:10 | 显示全部楼层
要进位就把这句 (setq zgc (itoa (fix (vla-get-Elevation obj))))改成
(setq zgc (rtos (vla-get-Elevation obj) 2 0))
 楼主| 发表于 2011-1-27 10:16:09 | 显示全部楼层
回复 gzxl 的帖子

改了这句后,进位的问题解决了,现在就剩循环的问题了,我再学习学习看能否自己完成。这个程序以后还会用到。再次感谢你帮我。祝你春节快乐!新的一年里事业蒸蒸日上。
发表于 2011-1-27 14:30:58 | 显示全部楼层
可以换个思路,将等高线Z值重新赋值,记得有个插件能够批量赋值的
 楼主| 发表于 2011-1-27 17:01:39 | 显示全部楼层
批量赋值我这里有,如果这个不行,也只好重新赋值了,但是我还是不死心,那位朋友已经帮了我很多,谢谢各位。
发表于 2011-1-27 21:58:29 | 显示全部楼层
在网络上曾经看见过有关类似的问题。
Int ( [elev]*10+0.5 )/10
进行四舍五入的编辑。
有一个有关小数点位数修改的程序从网上转给你参考:谢谢原作者
(defun c:tt ( / dcm dcm1 dcm2 dcm3 dcmdata ent2 ii itg itg1 itg2 itgdata ss ss1 ss2 ss3)
  (princ "功能:水深点小数点2位变1位")
  (setq ss (ssget ()))
  (setq ss1 (sslength ss))   ;ss1个数
  (setq ii 0)
  (repeat ss1
    (setq ss2 (ssname ss ii)) ;ss2图元名
    (setq ss3 (entget ss2))   ;ss3属性
    (setq ent2 ss3)
    (if (= (cdr (assoc 0 (setq ent2 (entget (entnext (cdr (assoc -1 ent2)))))))
            "ATTRIB"
        )
        (if (= (cdr (assoc 2 ent2)) "integer")
            (setq itg (cdr (assoc 1 ent2))
                  itgdata ent2
            )
        )
    )
    (if (= (cdr (assoc 0 (setq ent2 (entget (entnext (cdr (assoc -1 ent2)))))))
           "ATTRIB"
        )
        (if (= (cdr (assoc 2 ent2)) "decimal")
            (setq dcm (cdr (assoc 1 ent2))
                  dcmdata ent2
            )
        )
    )
    (setq dcm1 (atoi dcm))
    (if (/= "10" dcm2)
        (progn
           (setq dcm2 (rtos (* dcm1 0.1) 2 0)
                 dcm3 (cons 1 (strcat (itoa (atoi dcm2))))
                 dcmdata (subst dcm3 (assoc 1 dcmdata) dcmdata)
           )
           (entmod dcmdata)
        )
    )
    (if (= "10" dcm2)
        (progn
           (setq dcm1 0)
           (setq dcm2 (cons 1 (strcat (itoa dcm1))))
           (setq dcmdata (subst dcm2 (assoc 1 dcmdata) dcmdata))
           (setq itg1 (atoi itg))
           (setq itg2 (cons 1 (strcat (itoa (+ 1 itg1)))))
           (setq itgdata (subst itg2 (assoc 1 itgdata) itgdata))
           (entmod dcmdata)
           (entmod itgdata)
        )
    )
    (entmod dcmdata)
    (setq ii (1+ ii))
    (entupd ss2)
  )
  (princ)
)
祝你早点解决
发表于 2011-2-2 17:05:35 | 显示全部楼层
这个好像可以了。
(defun c:tt ()
  (princ "功能:等高线高程值取整")
  (setq ss (ssget "X" (list (cons 8 "dgx") (cons 0 "LWPOLYLINE"))))
  ;(setq ss (ssget))
  (if ss
    (progn
      (setq ss4 (sslength ss))
      (setq n 0)
      (while (/= ss4 n)
             (setq en (ssname ss n))
             (setq end (entget en))
             (setq a (cdr (assoc 38 end)) adata end)
             (setq b (rtos a 2 0))
             (setq adata (subst (cons 38 (atoi b)) (assoc 38 adata) adata))
             (entmod adata)
             (setq n (+ n 1))
      )
    )
  )
  (princ)
)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-18 12:17 , Processed in 0.167593 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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