列表元素删除与简单
好了,各位,几个月前,我为其中一个委员会编写了一个数据收集程序,基本上读取了x数量的图形中的所有块,并将信息存储在MS access数据库中。这让我想到,在使用简单迭代将项目与列表中的项目匹配后,是否值得从数组中删除项目。例如
;For the sake of the discussion topic imagine vl-sort doesn't exist
(setq BlockList(list
))
(setq modelSpaceBlocks (list [<x> All blocks within modelspace]))
(vlax-for BlockListc
(setq i -1)
(while (< (setq i(1= i))(length modelSpaceBlocks))
(if(equals (vla-getName c)(vla-getName (nth i modelSpaceBlocks))
(progn
;Do something with the block
;-------------------- Include or leave out? --------------
(vl-remove (nth i modelSpaceBlocks) modelSpaceBlocks)
;----------------------------------------------------------
)
)
)
)
也许不是最好的例子,但肯定有一个点,其中x的值足够高,以至于每次都要遍历它。在这种情况下,前500个块的删除可能会减慢程序的速度,但随着列表的大小逐渐减小,该过程不会与冗余块进行比较。有人对这个问题有什么想法吗?或者更好的是,有人做过比较吗?
索利弗。 我更关心的是你在BlockListc中通过相同的modelSpaceBlocks列表找到一个新的条目。
当您单步执行BlockListc时,只需检查其名称是否是预先单步执行的modelSpaceBlocks列表的成员(或vl位置),该列表只包含名称(mapcar的vla get name modelSpaceBlock)。
删除了i equal list长度-不应该出现在那里。
Mapcar肯定是一个更合适的设置,我花了太多时间在php lol上。
不要假设你可以提供一个如何实现vl位置的示例? 基于上述代码的代码片段(在这种情况下,成员是相同的,vl位置恰好快了一点点)。
(setq modelSpaceBlocks (mapcar 'vla-getName modelSpaceBlocks))
;; STUFF
(if (vl-position (vla-getName c) modelSpaceBlocks)
;; DO STUFF
)
没有意义的文字,所以我可以做这个帖子。
只是好奇;也许我错过了什么。。。。
我认为这是一个重复的工作,逐步通过一个块集合,将Vla对象保存到一个列表(modelSpaceBlocks),只使用(mapcar’Vla get name modelSpaceBlocks)获得一个块名列表。。。相反,这不是更简单吗:
(if (setq ss (ssget "_x" (list '(0 . "INSERT") (cons 410 (getvar 'ctab)))))
(progn
(vlax-for x (setq ss
(vla-get-activeselectionset
(vla-get-activedocument (vlax-get-acad-object))))
(if (not (vl-position (setq n (vla-get-name x)) blockList))
(setq blockList (cons (vla-get-name x) blockList))))
(if (vl-position "blockName" blockList)
;; do something
)
(vla-delete ss)))
啊,我明白你的意思了,我想:浏览一下列表,收集名字,然后用vl位置代替双vla get名字?
我认为最好是为每个块名创建一个列表列表,并将索引存储在每个列表中,例如:
#
(setq BlockIndices (list
("sampleBlockName" 1 25 40)
("otherBlock" 3 5 7)
))
并在区块列表迭代时使用vla项拾取项
这意味着modelSpaceBlocks列表的项目数将与blockList相同(或更少)。后面会有如下内容:
只有一个名称比较,然后映射器将其提取出来 很有可能,但根据我提供的信息,这是我能想到的最好的结果。不知道为什么他会有其他的名单。
不用担心,您明确表示要提供一个基于OP代码的示例。
这让我困惑不已。。。
此外,注意语法:
(foreach symbol List
6
哈哈,谢谢;我正在写代码在快速张贴甚至没有注意到我把它背对背:哈哈:
您引用的代码涵盖了通过modelSpaceBlocks的一次迭代中的所有比较,然后使用后续mapcar中的索引来收集与当前区块列表项名称相关的所有区块。如果使用sset获取块,则需要用于创建块索引的方法将有点混乱,或者至少不适合mapcar。然而,我认为这将拥有最少的vlax*、vla*、vl*调用
教育:
事后来看,这篇文章可能无法很好地解释区块索引列表的创建。我现在正在工作,但当我完成后会尝试发布一个合适的方法。
页:
[1]
2