WHM 发表于 2022-7-25 19:01:07

从我的错误中吸取教训。。。。

大家好!
 
你有没有同时被自己的聪明才智和愚蠢完全吓呆过?
 
我的涉及数据类型……我很清楚autolisp将浮点数据缩短到第4或第5位小数(用于显示),但仍保留完整的十进制数。
 
所以我一直在尝试编写一个程序,通过API调用从服务器获取geojson数据,然后在cad中为您绘制数据(现在已经完成并工作)。将数据转换为autolisp后,我使用read函数将字符串转换为列表……这就是所有神奇之处。
 
在使用read函数查看结果时,我注意到我的经度和纬度缩短到了4位小数。所以我对自己说,我必须在所有坐标中添加“以迫使read函数将其视为字符串,所以当数据仍在字符串中时,我必须添加”。
 
我不知道是否只有我或其他人经历过这种情况,但操纵字符串数据(实际上已经是列表形式)相当困难。所以我把字符串转换成一个ASCII列表,然后我可以用它来寻找一个模式来找到坐标,并将“添加到它们中。下面的程序。。
 
我对结果非常满意,我决定将其和读取函数进行比较,结果完全一样,我的方法要慢得多。
 
所以,对于任何想知道的人来说,read将存储你的浮点数!别像我一样愚蠢!
;Example data
;(_t2 "type LineString coordinates ((26.083354482 -33.316154796) (26.083742548 -33.316186902) (26.0840749 -33.31621582) (26.084660183 -33.316272006))")

(defun _t2 (datastr / datalist numlist pos prevpos gateop check prevchar gate firstchar gatecl)
    (defun _insertatpos ( ins pos lst / ctr )
      (setq ctr -1)
      (apply 'append (mapcar '(lambda ( x ) (if (= pos (setq ctr (1+ ctr))) (list ins x) (list x))) lst))
    )
    (setq datalist (vl-string->list datastr)
          numlist (list 45 46 48 49 50 51 52 53 54 55 56 57)
          gateop (list 40)
          gatecl (list 41)
          pos 0)
    (foreach x datalist
      (if (member x gateop)
            (setq gate t)
            (if (and (member x gatecl) gate)
                (progn
                  (if check
                        (setq datalist (_insertatpos 34 pos datalist)
                              pos (1+ pos)))
                  (setq gate nil
                        firstchar nil
                        check nil)
                )
            )
      )
      (if gate
            (progn
                (if (and (member x numlist) (member prevchar gateop))(setq firstchar t))
                (if (and (member x numlist) firstchar)
                  (progn
                        (if (not (= prevpos (- pos 1)))
                            (progn
                              (setq datalist (_insertatpos 34 pos datalist)
                                    pos (1+ pos)
                                    prevpos pos
                                    check t)
                            )
                            (setq prevpos pos)
                        )
                  )
                  (if check
                        (progn
                            (setq datalist (_insertatpos 34 pos datalist)
                                  pos (1+ pos)
                                  check nil)
                        )
                  )
                )
            )
      )
      (setq prevchar x
            pos (1+ pos))
    )
(vl-list->string datalist)
)
页: [1]
查看完整版本: 从我的错误中吸取教训。。。。