世界的一滴 发表于 2020-4-19 08:29:52

autolisp求助!导出坐标怎么实现最后一行重复首行坐标

(defun c:xzb (/)
(setvar "cmdecho" 0)
        (setq        ffn (getfiled "\n保存的坐标文件" "坐标" "txt" 1)
        ff(open ffn "w")
        ss(ssget '((0 . "*LINE")))
              i   -1
        )
        (setq xh 0);xh代表序号
        (repeat (sslength ss)
                (setq ssdata (entget (ssname ss (setq i (1+ i)))) n 0)
                (repeat (length ssdata)
                        (setq pp        (nth n ssdata) key (car pp))
                        (if (= key 10)
                                (progn
                                        (setq        tx (strcat (itoa (setq xh(1+ xh))) "," (rtos (caddr pp) 2 3) "," (rtos(cadr pp) 2 3) "," " " "1"))
                                        (write-line tx ff)
                                        )
                        )
                        (setq n (1+ n))
    )
)
(close ff)
(princ (strcat "\n 坐标写至=>" ffn))
(princ (strcat "\n 共提取" (itoa xh) "个坐标点"))       
(princ)
)
这个程序输出从第一点到最后一点坐标,我想最后一行再次输出第一点坐标,怎么实现??

世界的一滴 发表于 2020-4-19 15:56:31

本帖最后由 世界的一滴 于 2020-4-19 15:58 编辑

gaics 发表于 2020-4-19 10:08
还有你这代码都没有定义局部变量,写的不够严谨,运行能稳定吗?大神 这段代码运行后显示 错误: 参数类型错误: numberp: nil请问是哪里的问题啊
(defun c:sbzb (/ ffn ff ss mh pp n i x1 y1 mj xh)
(setvar "cmdecho" 0)
(vl-load-com)
      (setq      ffn (getfiled "\n保存的坐标文件" "坐标" "txt" 1);可以把此行的"txt"改为其他的后缀如:"dat","csv"
      ff(open ffn "w")
      ss(ssget '((0 . "*LINE")))
                i   -1
      )
      (write-line "[属性描述]" ff)
      (write-line "格式版本号=1.01版本" ff)
      (write-line "数据产生单位=" ff)
      (write-line "数据产生日期=20" ff)
      (write-line "坐标系=国家大地坐标系" ff)
      (write-line "几度分带=3" ff)
      (write-line "投影类型=高斯克吕格" ff)
      (write-line "计量单位=米" ff)
      (write-line "带号=41" ff)
      (write-line "精度=3" ff)
      (write-line "转换参数=0,0,0,0,0,0,1" ff)
      (write-line "[地块坐标]" ff)
      (command "area" "o" ss)
      (setq mj (getvar "area"))
      (setq mj (rtos (* mj 0.0001) 2 4)
            mh (strcat (itoa (1+ xh)) "," mj ",1,开发区,面,J51G067033J51G067034,仓储用地,063,@"))
      (write-line mh ff)
      (setq xh 0);xh代表序号
      (repeat (sslength ss)
                (setq ssdata (entget (ssname ss (setq i (1+ i)))) n 0)
                (repeat (length ssdata)
                        (setq pp      (nth n ssdata) key (car pp))
                        (if (= key 10)
                              (progn
                              (setq y (rtos (caddr pp) 2 3)
                                    x (rtos(cadr pp) 2 3))
                                  (setq      tx (strcat "J" (itoa (setq xh(1+ xh))) "," "1" "," (rtos (caddr pp) 2 3) "," (rtos(cadr pp) 2 3)))
                                       (write-line tx ff)
                                        )
                        (if (= xh 1)
                              (setq y1 y
                                    x1 x)
                                  (setq ty (strcat "J1" "," "1" "," y1 "," x1)))
                        )
                        (setq n (1+ n))
    )
)
                      (write-line ty ff)
(close ff)
(setvar "cmdecho" 1)
(princ (strcat "\n 坐标写至=>" ffn))
(princ (strcat "\n 共提取" (itoa xh) "个坐标点"))      
(princ)
)

大神 这段代码运行后显示 错误: 参数类型错误: numberp: nil请问是哪里的问题啊

gaics 发表于 2020-4-19 18:58:26

本帖最后由 gaics 于 2020-4-19 20:36 编辑

世界的一滴 发表于 2020-4-19 15:56
大神 这段代码运行后显示 错误: 参数类型错误: numberp: nil请问是哪里的问题啊
(defun c:sbzb (/ ffn f ...

(defun c:sbzb (/ ffn ff ss mh pp n i mj xh tx ty)
(setvar "cmdecho" 0)
(vl-load-com)
(setq ss (ssget '((0 . "*LINE"))))
(setq        ffn (getfiled "\n保存的坐标文件" "坐标" "txt" 1)
        ff(open ffn "w")
)
(write-line "[属性描述]" ff)
(write-line "格式版本号=1.01版本" ff)
(write-line "数据产生单位=" ff)
(write-line "数据产生日期=20" ff)
(write-line "坐标系=国家大地坐标系" ff)
(write-line "几度分带=3" ff)
(write-line "投影类型=高斯克吕格" ff)
(write-line "计量单位=米" ff)
(write-line "带号=41" ff)
(write-line "精度=3" ff)
(write-line "转换参数=0,0,0,0,0,0,1" ff)
(write-line "[地块坐标]" ff)
(setq i 0)
(repeat (sslength ss)
    (command "area" "o" (ssname ss i))
    (setq mj (getvar "area"))
    (setq mj (rtos (* mj 0.0001) 2 4)
          mh (strcat (itoa (1+ i))
                     ","
                     mj
                     ",1,开发区,面,J51G067033J51G067034,仓储用地,063,@"
             )
    )
    (write-line mh ff)
    (setq ssdata (entget (ssname ss i))
          n       0
          xh       0
    )
    (repeat (length ssdata)
      (setq pp        (nth n ssdata)
          key        (car pp)
      )
      (if (= key 10)
        (progn
          (setq        tx (strcat "J"
                           (itoa (1+ xh))
                           ","
                           "1"
                           ","
                           (rtos (caddr pp) 2 3)
                           ","
                           (rtos (cadr pp) 2 3)
                   )
          )
          (write-line tx ff)
          (if (= xh 0)
          (setq ty tx)
          )
          (setq xh (1+ xh))
        )
      )
      (setq n (1+ n))
    )
    (write-line ty ff)
    (setq i (1+ i))
)
(close ff)
(setvar "cmdecho" 1)
(princ (strcat "\n 坐标写至=>" ffn))
(princ (strcat "\n 共提取" (itoa xh) "个坐标点"))
(princ)
)

gaics 发表于 2020-4-19 17:44:41

本帖最后由 gaics 于 2020-4-19 17:57 编辑

世界的一滴 发表于 2020-4-19 17:01
(itoa (1+ xh)这个是为了获得所选 闭合多段线的顶点个数引用了后面的变量 不知该如何实现
ss 是我选择 ...
第一个问题:
(setq      mj (rtos (* mj 0.0001) 2 4)
      mh (strcat (itoa (1+ xh))
                   ","
                   mj
                   ",1,开发区,面,J51G067033J51G067034,仓储用地,063,@"
         )
)

此处的mh如果仅代表第一个数据的话,可以把(itoa (1+ xh))直接改为“1”。

第二个问题:
(ssget '((0 . "*LINE")))包含“line”,选到直线的话后面求面积会出错。

第三个问题:
(command "area" "o" ss)只能得到选择集ss中最后一个图元的面积。

第四个问题:
(if (= xh 1)
          (setq      y1 y
                x1 x
          )
          (setq ty (strcat "J1" "," "1" "," y1 "," x1))
)
如果xh不等于1,则“y1”“x1”均无赋值。

gaics 发表于 2020-4-19 10:05:15

设置一个变量保存第一行数据,退出循环后再调用

gaics 发表于 2020-4-19 10:08:49

本帖最后由 gaics 于 2020-4-19 10:10 编辑

还有你这代码都没有定义局部变量,写的不够严谨,运行能稳定吗?

gaics 发表于 2020-4-19 16:03:55

本帖最后由 gaics 于 2020-4-19 16:07 编辑

世界的一滴 发表于 2020-4-19 15:56
大神 这段代码运行后显示 错误: 参数类型错误: numberp: nil请问是哪里的问题啊
(defun c:sbzb (/ ffn f ...
mh (strcat (itoa (1+ xh))

这句之前并未给“xh”赋值
(command "area" "o" ss)
这句也不对,ss里面都是直线,哪来的面积?封闭多段线或者面域才有面积属性。

世界的一滴 发表于 2020-4-19 17:01:17

gaics 发表于 2020-4-19 16:03
mh (strcat (itoa (1+ xh))

这句之前并未给“xh”赋值


(itoa (1+ xh)这个是为了获得所选 闭合多段线的顶点个数引用了后面的变量 不知该如何实现
ss 是我选择的闭合多段线 可以有面积的

世界的一滴 发表于 2020-4-19 18:24:07

gaics 发表于 2020-4-19 17:44
第一个问题:
(setq      mj (rtos (* mj 0.0001) 2 4)
      mh (strcat (itoa (1+ xh))


可能是我没描述清楚,其实我就是选择一个 闭合的多段线需要显示顶点个数以及面积各顶点坐标你说的这几个问题 都不是问题。。。:'(

gaics 发表于 2020-4-19 18:27:08

世界的一滴 发表于 2020-4-19 18:24
可能是我没描述清楚,其实我就是选择一个 闭合的多段线需要显示顶点个数以及面积各顶点坐标你说 ...

这些问题不解决,代码没法运行:'(

世界的一滴 发表于 2020-4-19 18:57:21

gaics 发表于 2020-4-19 18:27
这些问题不解决,代码没法运行

:'(我再想想 非常感谢
页: [1] 2
查看完整版本: autolisp求助!导出坐标怎么实现最后一行重复首行坐标