自贡黄明儒
发表于 2014-10-15 11:22:35
highflybir 发表于 2014-10-15 10:22 static/image/common/back.gif
严格地说来,反应器回调函数是可以使用command命令的.
不过不能使用与CAD交互的命令,譬如等待用户输入的 ...
这个应该是标准答案,书上说的不准确。
上次我测试了一下网友的反应器,他中间就用了command ,程序正常
自贡黄明儒
发表于 2014-10-15 11:28:18
highflybir 发表于 2014-10-15 11:19 static/image/common/back.gif
对话框被打开时的函数限制:
当对话框被激活(即调用start_dialog)时,不能调用要求用户在AutoCAD命令行输 ...
对话框显示后,我的感觉是程序不断在start_dialog和done_dialog之间扫描。
highflybir
发表于 2014-10-15 11:39:28
自贡黄明儒 发表于 2014-10-15 09:44 static/image/common/back.gif
;;以往只是听说,但从未测试
;;Max(min)限制是:如果下面的256改为255就OK了
(defun w1 (/ L N)
这个好像不是Max,或者Min函数的限制,如果换一种用法,就可以了,
譬如 (apply 'max L)
不用eval,而改用 apply
可见,这个是eval带来的问题。
highflybir
发表于 2014-10-15 11:55:43
本帖最后由 highflybir 于 2014-10-15 11:57 编辑
自贡黄明儒 发表于 2014-10-15 09:44 static/image/common/back.gif
;;以往只是听说,但从未测试
;;Max(min)限制是:如果下面的256改为255就OK了
(defun w1 (/ L N)
不过话说回来,似乎这个地方还是牵涉到一个限制:
似乎LISP的参数限制不能超过256个:
比较下面三种方法:
1. (eval (cons max L))
2. (max 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255)
3.(apply 'max l)
1,2两种方法都会显示:
error: internal restriction: too many arguments in function call:
#<SUBR...
或:
error: bad argument value: does not fit in byte: 256
第3种方法正常运行。
这样,问题就来了,LISP的参数个数真的不能超过255么?
ll_j
发表于 2014-10-15 12:25:34
highflybir 发表于 2014-10-15 11:55 static/image/common/back.gif
不过话说回来,似乎这个地方还是牵涉到一个限制:
似乎LISP的参数限制不能超过256个:
比较下面三种方法 ...
数值运算的基本都是有256限制,包括+-*/等,但lisp本身并不受此限制,defun函数本身就是无限制参数。
这个问题以前有过讨论,不过现在找不到那个帖子了。
ivde
发表于 2014-10-15 19:08:28
限制无处不在,这是规则,只不过有的明示,有的是"潜规则”
机械工程师
发表于 2014-10-16 08:40:20
尽网友之力,把尽量多的潜规则显现出来,方便后来者。
其实这个也可以说说一些经典bug。
比如ip地址问题之类的。getstring等提示参数含有中文字符时可能处理异常等等。
这些bug其实也是限制。
机械工程师
发表于 2014-10-16 08:43:37
highflybir 发表于 2014-10-15 11:19 static/image/common/back.gif
对话框被打开时的函数限制:
当对话框被激活(即调用start_dialog)时,不能调用要求用户在AutoCAD命令行输 ...
可以用princ的吧
(princ (strcat "\n" "用户:" (getvar "loginname") "。"))
不死猫
发表于 2014-10-16 09:19:27
使用全中文变量会经常出现变量值冲突的情况.(建议中英结合)
超过2M的lsp制作fas会报错(普通程序未测试,加密代码制作fas测试约1.7mb以上报错)
defun commandcond if progn setq while repeat 等函数无法用lisp重定义
64位autocad上面很多windows activex对象无法获取(例如MSScriptControl.ScriptControl)
不死猫
发表于 2014-10-16 09:29:08
ssget "c" pt1 pt2 只能获取可见区域内的东西,而且就算在可见区,当视口高度过高,ssget范围太小的时候依然不能获取图元.建议先执行 (command"zoom" pt1 pt2)然后(ssget "c" pt1 pt2)最后(command "zoom" "p")可惜这样在大循环的时候效率降低很多,不过可以确保ssget有效.