woxing1987 发表于 2011-11-10 19:45:38

我也有同样疑问

woxing1987 发表于 2011-11-10 20:02:02

我也想知道啊,请高手指点

wylong 发表于 2011-11-13 12:11:10

使用VLAX类结合VBA可以实现夹点显示。
VLAX类代码:' VLAX.CLS v2.0 (Last updated 8/1/2003)
' Copyright 1999-2001 by Frank Oquendo
'
' 该程序由明经通道修改支持2004版本
' http://www.mjtd.com
'
' Permission to use, copy, modify, and distribute this software
' for any purpose and without fee is hereby granted, provided
' that the above copyright notice appears in all copies and
' that both that copyright notice and the limited warranty and
' restricted rights notice below appear in all supporting
' documentation.
'
' FRANK OQUENDO (THE AUTHOR) PROVIDES THIS PROGRAM "AS IS" AND WITH
' ALL FAULTS. THE AUTHOR SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY
' OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE.THE AUTHOR
' DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE
' UNINTERRUPTED OR ERROR FREE.
'
' Use, duplication, or disclosure by the U.S. Government is subject to
' restrictions set forth in FAR 52.227-19 (Commercial Computer
' Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii)
' (Rights in Technical Data and Computer Software), as applicable.
'
' VLAX.cls allows developers to evaluate AutoLISP expressions from
' Visual Basic or VBA
'
' Notes:
' All code for this class module is publicly available througout various posts
' at news://discussion.autodesk.com/autodesk.autocad.customization.vba. I do not
' claim copyright or authorship on code presented in these posts, only on this
' compilation of that code. In addition, a great big "Thank you!" to Cyrille Fauvel
' demonstrating the use of the VisualLISP ActiveX Module.
'
' Dependencies:
' Use of this class module requires the following application:
' 1. VisualLISP

Private VL As Object
Private VLF As Object

Private Sub Class_Initialize()
    Dim AcadVersion As Integer
    With ThisDrawing.Application
      AcadVersion = Val(Left(.Version, 2))
      '根据AutoCAD的版本判断使用的VL库类型
      Select Case AcadVersion
            Case Is = 15
                Set VL = .GetInterfaceObject("VL.Application.1")
            Case Is >= 16
                Set VL = .GetInterfaceObject("VL.Application.16")
      End Select
    End With

    Set VLF = VL.ActiveDocument.Functions
End Sub

Public Function EvalLispExpression(lispStatement As String)
    '根据LISP表达式调用函数
    Dim sym As Object, ret As Object, retVal

    Set sym = VLF.Item("read").funcall(lispStatement)

    On Error Resume Next

    retVal = VLF.Item("eval").funcall(sym)
    If Err Then
      EvalLispExpression = ""
    Else
      EvalLispExpression = retVal
    End If

    On Error GoTo 0
End Function

Public Sub SetLispSymbol(symbolName As String, value)
    Dim sym As Object, ret, symValue
    symValue = value

    Set sym = VLF.Item("read").funcall(symbolName)

    ret = VLF.Item("set").funcall(sym, symValue)
    EvalLispExpression "(defun translate-variant (data) (cond ((= (type data) 'list) (mapcar 'translate-variant data)) ((= (type data) 'variant) (translate-variant (vlax-variant-value data))) ((= (type data) 'safearray) (mapcar 'translate-variant (vlax-safearray->list data))) (t data)))"
    EvalLispExpression "(setq " & symbolName & "(translate-variant " & symbolName & "))"
    EvalLispExpression "(setq translate-variant nil)"
End Sub

Public Function GetLispSymbol(symbolName As String)
    Dim sym As Object, ret, symValue
    symValue = value

    Set sym = VLF.Item("read").funcall(symbolName)

    GetLispSymbol = VLF.Item("eval").funcall(sym)
End Function

Public Function GetLispList(symbolName As String) As Variant
    Dim sym As Object, list As Object
    Dim Count, elements(), i As Long

    Set sym = VLF.Item("read").funcall(symbolName)
    Set list = VLF.Item("eval").funcall(sym)

    Count = VLF.Item("length").funcall(list)

    ReDim elements(0 To Count - 1) As Variant

    For i = 0 To Count - 1
      elements(i) = VLF.Item("nth").funcall(i, list)
    Next

    GetLispList = elements
End Function

Public Sub NullifySymbol(ParamArray symbolName())
    Dim i As Integer

    For i = LBound(symbolName) To UBound(symbolName)
      EvalLispExpression "(setq " & CStr(symbolName(i)) & " nil)"
    Next
End Sub

Private Sub Class_Terminate()
    '类析构时,释放内存
    Set VLF = Nothing
    Set VL = Nothing
End Sub以下为测试代码:'使用直线选择集测试
Sub ShowSelectLineCrips()
    Dim ss As AcadSelectionSet
    Dim objLine As AcadLine

    Dim fType(0 To 0) As Integer
    Dim fData(0 To 0) As Variant
    Dim AutoSelect As Boolean

    'AutoSelect = True

    On Error Resume Next
    ThisDrawing.SelectionSets("SelectText").Delete
    Set ss = ThisDrawing.SelectionSets.Add("SelectText")
    On Error GoTo 0

    On Error GoTo ErrHandle

    '创建过滤机制
    fType(0) = 0: fData(0) = "LINE"         '直线

    '选择符合条件的所有图元
    If AutoSelect Then
      '自动选择方式
      ss.Select acSelectionSetAll, , , fType, fData
    Else
      '提示用户选择
      ss.SelectOnScreen fType, fData
    End If
    If ss.Count = 0 Then Exit Sub

    '显示夹点
    ShowSelectionSetCrips ss

    '删除数组
    Erase fType: Erase fData

    '删除选择集
    ss.Clear: ss.Delete

    Set ss = Nothing
    Set objLine = Nothing

    Exit Sub
ErrHandle:
    MsgBox Err.Description, vbCritical, "产生了以下错误:"
    Err.Clear
End Sub
'显示选择集中对象的夹点
Public Sub ShowSelectionSetCrips(ByRef ss As AcadSelectionSet)
    Dim LispCode As New VLAX
    Dim objEnt As AcadEntity

    With LispCode
      .EvalLispExpression "(setq ss (ssadd))"

      For Each objEnt In ss
            .EvalLispExpression "(ssadd " & _
                              "(handent " & Chr(34) & _
                              objEnt.Handle & Chr(34) & ")" & _
                              "ss" & _
                              ")"
      Next

      .EvalLispExpression "(sssetfirst nil ss)"
      .EvalLispExpression "(setq ss nil)"
    End With
    Set LispCode = Nothing
    'MsgBox "您选择了" & ThisDrawing.PickfirstSelectionSet.Count & "个对象"
End Sub注:以上代码在AutoCAD2004中调试通过。

liub951030 发表于 2011-11-17 20:26:24

这个问题我也找了好久都没找到答案,试下上面的方法好用不!

pmq 发表于 2011-12-12 21:01:32

谢谢 wylong 了,VBA也可以实现夹点显示了。

振明 发表于 2011-12-15 16:46:45

我也试了为什么提示:Dim LispCode As New VLAX   用户类型未定义,怎么办?

万里天 发表于 2012-12-5 15:24:15

太好用了,谢谢!

ugl 发表于 2012-12-7 00:39:47

还是LISP省事,VLAX一大堆代码,看着都头晕

ugl 发表于 2013-1-13 19:24:48

振明 发表于 2011-12-15 16:46 static/image/common/back.gif
我也试了为什么提示:Dim LispCode As New VLAX   用户类型未定义,怎么办?

新建一个类模块,感谢上面的提供,的确比LISp好,这样可以按空格重复执行

jicqj 发表于 2013-5-14 23:02:48

VLAX   也是一种方法 顶起来。
页: 1 [2] 3 4
查看完整版本: [求助]怎么用VBA实现选择集中的实体处于被选中状态?