从我的错误中吸取教训。。。。
大家好!你有没有同时被自己的聪明才智和愚蠢完全吓呆过?
我的涉及数据类型……我很清楚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]