hardwired 发表于 2008-4-17 09:02:16

简单的BlockCounter不起作用。。

嗨,
在浏览了一些工作中的旧文件夹后,我发现了一个Block Count程序,我显然在几年前的某个时候正在使用它,并认为我应该测试它...
它做了它应该做的一切,除了实际显示用户选择的块数,它应该在表单的标签标题中显示...
有什么想法为什么SelectionSet计数可能为0?
我看不出我的生活/和我有限的VBA知识,哈哈,有什么问题...
**** Hidden Message *****

Bryco 发表于 2008-4-17 10:07:59

我会看看的

hardwired 发表于 2008-4-17 10:10:18

选择集部分。
FilterType和FilterData必须是有序对。
修复后,您会发现在此绘图中的For Each ssBlockZ中需要一个出口。选择设置部分
它将帮助您学习使用f8逐句通过代码,然后您可以在运行程序时测试值。当你发现有问题时,你会试着隔离问题,然后只解决那部分。就获得帮助而言,我宁愿看帖子中的一些代码,也不愿摆弄dvb。

Joro-- 发表于 2008-4-17 10:23:35

这是更正后的代码
Option Explicit
Dim blockZ As AcadBlock'ThisDrawing.Blocks..
Dim getBlock As AcadEntity'Select a block to count..
Dim no_of_blocksX As Integer'Number of blocks (selected)..
Dim allBlocks As Integer'Number of block (in entire drawing)..
Dim basex As Variant'Pick point for block selection..
Dim Lblockname As String, Lblockname2 As String'Left character in the blockname (to filter out unwanted blocks from the list)..
Dim checkname As Integer'Compares actual block names with combobox block names..
Dim SSet As AcadSelectionSet'Selection set for blocks..
Dim blockname As String'Name of block picked..
Dim response As Integer 'Yes / No..
' Update the block count each time the combobox text is changed..
Private Sub BlockNameCMBO_Change()
For Each SSet In ThisDrawing.SelectionSets
    If SSet.Name = "GetBlocks" Then
      SSet.Delete
    End If
Next SSet
blockname = BlockNameCMBO.Text
Dim FilterType(0 To 1) As Integer'Selection Set - Filter type..
Dim FilterData(0 To 1) As Variant'Selection Set - Filter data..
' Create a selection set..
Set SSet = ThisDrawing.SelectionSets.Add("GetBlocks")
FilterType(0) = 0: FilterData(0) = "INSERT"
FilterType(1) = 2: FilterData(1) = blockname
SSet.Select acSelectionSetAll, , , FilterType, FilterData
no_of_blocksX = SSet.Count
lblTotal.Caption = no_of_blocksX
End Sub
' Select a block..
Private Sub PickBlockBTN_Click()
blockcountform.Hide
On Error Resume Next
TryAgain:
ThisDrawing.Utility.GetEntity getBlock, basex, vbCr & "Select a block to count.. "
ErrHndlr:
    If Err.Number0 Then
      Err.Clear
      GoTo TryAgain
    End If
    On Error GoTo ErrHndlr
   
BlockNameCMBO.Text = getBlock.Name'Show the selected block name in the combobox..
blockcountform.Show
End Sub
'********************************************
'*************** FORM LOAD ****************
'********************************************
Private Sub UserForm_Initialize()
For Each blockZ In ThisDrawing.Blocks
    Lblockname = Left(blockZ.Name, 1): Lblockname2 = Left(blockZ.Name, 2)
      If Lblockname"_" And Lblockname"*" And Lblockname2"A$" Then
            With BlockNameCMBO
            .AddItem (blockZ.Name)
      End With
    End If
Next
End Sub
'********************************************
'*************** FORM LOAD ****************
'********************************************
'********************************************
'*************** FORM UNLOAD ****************
'********************************************
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
response = MsgBox("Are you sure you've finished with the 'Block Counter program?..", vbQuestion + vbYesNo, "End the Program..")
    If response = vbNo Then
    Cancel = 1
    End If
    If response = vbYes Then
      Unload Me
    End If
End Sub
'********************************************
'************* END FORM UNLOAD **************
'********************************************

就像Bryco说的,您的过滤器对有点不对劲,但我修复了它。我还更改了一些var的名称,因为使用具有同名sset的var太令人困惑了

Bryco 发表于 2008-4-17 10:27:12

谢谢伙计们,
这就是伙计们,我看不见它,但是当你指出它时,它很明显,但现在按照我想要的方式运行,谢谢.
哦,是的,这很酷,我只上传了整个dvb,因为它有一个用户表单,并认为ppl以这种方式测试会更快,但是是的,你是对的。
谢谢你们俩。

Joro-- 发表于 2008-4-18 16:07:30

有人能告诉我在哪里可以看到如何使用这篇文章所附的代码中的FilterCode和FilterData。我似乎明白了主要的想法,但是我如何使用这种方法来生成基于层或对象名称或其他的对象选择...谢谢。

Fatty 发表于 2008-4-18 17:35:19


Vba允许使用FilterCodes和FilterData对这些代码进行有限的访问。
它们必须始终成对,一个代码和一个数据。
有更多时间的人可能会给你更好的解释。
我认为CmdrDuh在这个主题上写了一些很好的文章。

Joro-- 发表于 2008-4-19 02:39:08

谢谢Btyco,
我找到了一些示例代码。Byt有什么方法可以让选择项在过程结束后保持选中状态,以便我可以手动对其执行其他操作?

Fatty 发表于 2008-4-19 08:27:13

你可以看一下这个页面(这是我朋友的一个站点):
http://www . CAD foryou . SPB . ru/index . PHP?current _ section = section _ programs _ page
搜索CountBlocks项目,向下滚动大约页面的一半
页: [1]
查看完整版本: 简单的BlockCounter不起作用。。