- UID
- 76071
- 积分
- 1505
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2003-8-30
- 最后登录
- 1970-1-1
|
发表于 2004-5-9 12:23:33
|
显示全部楼层
将VLAX类的EvalLispExpression子程改动一下可以实现
Public function EvalLispExpression(lispStatement As String)
On Error GoTo ErrClear
Dim sym As Object, ret As Object, retVal
EvalLispExpression = ""
Set sym = VLF.Item("read").funcall(lispStatement)
retVal = VLF.Item("eval").funcall(sym)
EvalLispExpression = retVal
ErrClear:
End Function
总觉得VLAX类不太健壮
测试(插入一个块,拖动并旋转):
先导入Lisp函数dd,再生成一个名为"123"的块
Sub Test()
On Error Resume Next
Dim obj As VLAX, retVal
Dim a As String, b
Dim c(2) As Double, d(2) As Double
Dim pObj As AcadBlockReference, pLine As AcadLine
Set obj = New VLAX
retVal = obj.EvalLispExpression("(dd)")
Set obj = Nothing
a = Split(retVal, ",")(0)
Err.Clear
Set pObj = ThisDrawing.ModelSpace.InsertBlock(c, "123", 1, 1, 1, 0)
ThisDrawing.Utility.Prompt vbCr & "请输入插入点:" & vbCr
Do While a <> "3"
Set obj = New VLAX
retVal = obj.EvalLispExpression("(dd)")
Set obj = Nothing
a = Split(retVal, ",")(0)
Err.Clear
If a = 5 Then
b = Split(retVal, ",")
Err.Clear
c(0) = b(1)
c(1) = b(2)
pObj.InsertionPoint = c
Err.Clear
End If
Loop
a = 5
ThisDrawing.Utility.Prompt vbCr & "请输入旋转角度:" & vbCr
Set pLine = ThisDrawing.ModelSpace.AddLine(c, d)
Do While a <> "3"
Set obj = New VLAX
retVal = obj.EvalLispExpression("(dd)")
Set obj = Nothing
a = Split(retVal, ",")(0)
Err.Clear
If a = 5 Then
b = Split(retVal, ",")
Err.Clear
c(0) = b(1)
c(1) = b(2)
pLine.EndPoint = c
pObj.Rotation = ThisDrawing.Utility.AngleFromXAxis(pObj.InsertionPoint, c)
Err.Clear
End If
Loop
pLine.Delete
End Sub
Lisp函数
(defun dd()
(setq a (grread t))
(if (OR (= 3 (car a)) (= 5 (car a)))
(setq str (strcat (itoa (car a))
","
(rtos (caadr a) 2 4)
","
(rtos (cadadr a) 2 4)
","
(rtos (cadr (cdadr a)) 2 4)
)
)
)
(IF (OR (= 2 (car a)) (= 11 (car a)))
(setq str (strcat (itoa (car a))
","
(itoa (cadr a))
)
)
)
str
) |
|