TheSwamp
Code Red => VB(A) => Topic started by: Bryco on April 08, 2007, 12:42:57 PM
-
I haven't attached xdata to blocks before as I've always added it to the blockreferences.
But now I find if I add it to an existing block definition it automatically becomes part of acad DesignCenter Data, ????.
Here's a couple of subs to show it.
If you run the first one you get the expected (and desired) result
1001 Yours
1000 CCCC
The second one debug.prints
1001 ACAD
1000 DesignCenter Data
1002 {
1070 1
1070 1
1002 }
1001 Yours
1000 CCCC
Sub MakeBlockwithXdata()
Dim oBlock As AcadBlock
Dim Zero(2) As Double
Set oBlock = ThisDrawing.Blocks.Add(Zero, "L")
oBlock.AddCircle Zero, 4
Dim DataType(1) As Integer
Dim Data(1) As Variant
DataType(0) = 1001: Data(0) = "Yours"
DataType(1) = 1000: Data(1) = "CCCC"
oBlock.SetXData DataType, Data
getxd "L"
End Sub
Sub AddXdatatoBlock()
Dim oBlock As AcadBlock, P
Dim br As AcadBlockReference
ThisDrawing.Utility.GetEntity br, P, "Pick"
Set oBlock = ThisDrawing.Blocks(br.Name)
Dim DataType(1) As Integer
Dim Data(1) As Variant
DataType(0) = 1001: Data(0) = "Yours"
DataType(1) = 1000: Data(1) = "CCCC"
oBlock.SetXData DataType, Data
getxd oBlock.Name
End Sub
Function getxd(sBlock As String)
Dim oBlock As AcadBlock
Set oBlock = ThisDrawing.Blocks(sBlock)
Dim sMt As String
Dim xdataOut As Variant
Dim xtypeOut As Variant
Dim i As Integer
Debug.Print
oBlock.GetXData "", xtypeOut, xdataOut
If IsEmpty(xtypeOut) = False Then
For i = 0 To UBound(xtypeOut)
Debug.Print xtypeOut(i), xdataOut(i)
Next
End If
End Function
-
Not sure what your are asking or telling, as I do not know the difference between a block or blockreference.
The only thing I can see is that you are not clearing previous xdata on write. Note: if it is one time write, no big deal, but perhaps you are not really adding the data to blocks at all. as in, its already there???
Try clearing to data before the write. Make sure you test the object. the data that you are seeing may be needed for use later by acad and cause a corruption issue???
Public Function setXdataInformation(ByVal itm As AcadObject, sAppName As String, sValue As String) As Boolean
Dim DataType(0 To 1) As Integer
Dim Data(0 To 1) As Variant
Dim clearDataType(0) As Integer
Dim clearData(0) As Variant
If itm Is Nothing Then
'MsgBox "not found"
Exit Function
End If
' -- create new xdata item
clearDataType(0) = 1001: clearData(0) = sAppName
itm.SetXData clearDataType, clearData
' -- save data
DataType(0) = 1001: Data(0) = sAppName
DataType(1) = 1000: Data(1) = sValue
itm.SetXData DataType, Data
' -- cleanup
Set itm = Nothing
End Function
-
Dave I was trying to show that Acad is adding stuff on it's own. (acad2006)
A block is basically a non graphical description of how to group some objects together, a blockreference is the graphic part where the group of objects is inserted into the drawing.
I can't see a need for clearing xdata as setxdata seems to clear whatever is in the app already.
-
Thanks for explaining the difference.
I see you are saying ACAD writes that on its own. I am not surprised and knowing that is there allows coders to use it in creative ways if need be.
Interesting. Our code just kept appending the xdata unless it was cleared. I have even seen posts where people were asking how to delete it and the answer was to write nothing back first, so that is what we did. Perhaps there was a slight difference between your code and ours at the time. I have no idea what that code was now though, so no comparision is possible.