lisp图元计数不准

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lisp图元计数不准相关的知识,希望对你有一定的参考价值。

;请求大师修正
;本练习的目的是计算选定的图元个数,重叠的图元只计为1个图元
;只要图元名称相同,并且图元的插入点的坐标也相同,就认为是重叠图元
;从选择集的图元总数中减去重叠图元的数量,就是应返回的实际图元的个数
(defun c:tygs()
(setq ss (ssget))
(setq i 0)
(setq gs (length ss))
(repeat (- gs 1)
(setq zb1 (cdr (assoc 10 (entget (ssname ss i)))))
(setq zb2 (cdr (assoc 10 (entget (ssname ss (+ 1 i))))))
(setq mc1 (cdr (assoc 2 (entget (ssname ss i)))))
(setq mc2 (cdr (assoc 2 (entget (ssname ss (+ 1 i))))))
(setq tym1 (cdr (assoc -1 (entget (ssname ss i)))))
(setq tym2 (cdr (assoc -1 (entget (ssname ss (+ 1 i))))))
(if (and (= zb1 zb2) (= mc1 mc2) (= tym1 tym2))
(setq tygs (- gs 1))
)
(setq i (+ 1 i))
)
)
(print (strcat (itoa tygs) "个"))
(princ)
)

这种有可能计数不准确,因为你在选择的时候是窗口选择,属于批量性覆盖选择,虽然两个图元是一样的,但生成的时间不同,有可能在选择集的排序也是不一样的,本图元与下一个图元之间的比较久可能会出错。 参考技术A 一楼说的没错,虽然你是复制的,系统操作出来的图元名是惟一的,尽管大小都一样但名字不同。问题就出在这里,你可以尝试对比其他信息,例如面积与位置同时相等就算一个。追问

;改成以下的,不稳定,也者是出错
(defun c:tygs()
(setq ss (ssget))
(setq i 0)
(setq gs (sslength ss))
(repeat (- gs 1)
(setq sj1 (entget (ssname ss i)))
(setq sj2 (entget (ssname ss i)))
(if (= sj1 sj2)
(progn
(setq tygs (1- gs))
(setq i (1+ i))
)
)
)
(print tygs)
(princ)
)

参考技术B 文字插入点是直线段的起点,那文字与直线算不算是相同的图元?

STM32 滴答定时器

STM32 系统滴答定时器等待计数溢出,请问这句话怎么理解。 计数溢出以后该位置1,取反后为0,while()就不成立,就不会执行后面的语句。我这样理解应该是错的,但就是钻不出来了,请指教
//等待计数溢出
while(!(SysTick->CTRL&(1<<16)));
//关闭定时器
SysTick->CTRL &= ~(1<<0);
//清除标志位
SysTick->VAL = 0;//清除溢出标志位

参考技术A 你后面的关闭定时器、清除标志位的语句又不在while循环里面,你这个while语句是空循环来的。。。所以在定时器溢出置位之前,CPU一直在while循环里空转,啥都不干,换句话说就是等待定时器溢出,然后才执行下面的语句。追问

追答

当定时器还没溢出,SysTick的CTRL寄存器第16位为0,与(1<<16)即0x10000000000000000做按位与运算(&),结果必为0,再取反(!),结果为1,while循环的条件成立,所以CPU一直在执行while这个空循环。直到定时器溢出,SysTick的CTRL寄存器第16位置1,与(1<<16)即0x10000000000000000做按位与运算(&),结果不为0,再取反(!),结果不为1,while循环条件不成立,跳出循环,执行下面的语句。我觉得你应该去补补C语言还有STM32的编程手册。。。

追问

谢谢,十分感谢

以上是关于lisp图元计数不准的主要内容,如果未能解决你的问题,请参考以下文章

stm32编码器停止计数

将科学计数法输出为十进制计数法

电子台秤功能怎么使用

STM32 滴答定时器

lisp里面选集SS1 和 选集SS2 如何合并成选集SS? 还有就是 我用复制命令复制了多个图元 (command "copy" s

CADlisp编程:如何用lisp处理一个dwg图形中的多个多线段?