Реклама i
Стань нашим партнером - зарабатывай с нами!
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > вставка блока со смещенными атрибутами в .NET

вставка блока со смещенными атрибутами в .NET

Ответ
Поиск в этой теме
Непрочитано 03.07.2012, 14:47 #1
вставка блока со смещенными атрибутами в .NET
2san
 
Регистрация: 15.11.2011
Сообщений: 11

вставлюя блок через такой код:
Код:
[Выделить все]
            Using db As Database = WorkingDatabase
                Using tr As Transaction = db.TransactionManager.StartTransaction
                    Try
                        Dim myBT As BlockTable = DocumentManager.MdiActiveDocument.Database.BlockTableId.GetObject(OpenMode.ForRead)
                        ' Open current space for write
                        Dim myBTR As BlockTableRecord = CType(tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord)

                        ' Insert Block
                        Dim blkTid As ObjectId = BlockNameToID(strBlockName)
                        Dim myBlockDef As BlockTableRecord = blkTid.GetObject(OpenMode.ForRead)

                        Dim myBlockRef As New BlockReference(New Point3d(x, y, 0), blkTid)

                        Dim obj As ObjectId = myBTR.AppendEntity(myBlockRef)
                        tr.AddNewlyCreatedDBObject(myBlockRef, True)
                      
                        Dim myEnt As DatabaseServices.Entity
                        Dim attt As String

                        Dim myBTREnum As BlockTableRecordEnumerator = myBlockDef.GetEnumerator
                        While myBTREnum.MoveNext
                            myEnt = myBTREnum.Current.GetObject(OpenMode.ForWrite)
                            If TypeOf myEnt Is AttributeDefinition Then
                                myEnt.UpgradeOpen()
                                Dim myAttDef As AttributeDefinition = CType(myEnt, AttributeDefinition)
                                Dim myAttRef As New AttributeReference

                                With myAttRef
                                    myAttRef.SetAttributeFromBlock(myAttDef, myBlockRef.BlockTransform)
                                    If dPosAttrs <> 0 Then
                                        If (BaseAttY = 0) Then BaseAttY = .Position.Y
                                        'смещение атрибутов относительно базового положения по вертикали
                                        .Position = New Point3d(.Position.X, .Position.Y  + 3, 0)
                                    End If
                                    If (arrAttrValues IsNot Nothing) Then
                                        If (arrAttrValues.Contains(.Tag)) Then
                                            attt = arrAttrValues(.Tag)
                                            If (attt <> "") Then .TextString = attt.ToString.Trim
                                        End If
                                    End If

                                End With
                                myBlockRef.AttributeCollection.AppendAttribute(myAttRef)
                                tr.AddNewlyCreatedDBObject(myAttRef, True)
                            End If
                        End While
                        myBlockRef.Layer = strLayerName

                        ' Set return value
                        retVal = myBlockRef.ObjectId

                    Catch ex As Autodesk.AutoCAD.Runtime.Exception
                        tr.Dispose()
                    Finally
                        If tr.IsDisposed = False Then tr.Commit()
                    End Try
                End Using ' dispose transaction
            End Using ' dispose database
никак не получается добится смещения атрибутов во вставленном блоке.
если заменить TRUE на FALSE в
Код:
[Выделить все]
tr.AddNewlyCreatedDBObject(myAttRef, True)
то все прекрасно вставляется и смещается, до того момента пока не подведешь курсор к блоку в чертеже - после этого автокад закрывается с фатальной ошибкой.

подскажите как разрулить эту ситуацию?
Просмотров: 3377
 
Непрочитано 03.07.2012, 17:43
#2
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от 2san Посмотреть сообщение
как разрулить эту ситуацию?
для начала - задавать такие вопросы в ветке "Программирование"...
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 04.07.2012, 00:51
1 | #3
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Цитата:
Сообщение от 2san Посмотреть сообщение
подскажите как разрулить эту ситуацию?
Посмотри как надо делать правильно:

Код:
[Выделить все]
                           ''by Stephen Preston
		<CommandMethod("AddBlockTest")> _
		Public Shared Sub AddBlockTest()


			Dim db As Database = Application.DocumentManager.MdiActiveDocument.Database

			Using myT As Transaction = db.TransactionManager.StartTransaction()


				'Get the block definition "Check".

				Dim blockName As String = "CHECK"


				Dim bt As BlockTable = TryCast(db.BlockTableId.GetObject(OpenMode.ForRead), BlockTable)


				Dim blockDef As BlockTableRecord = TryCast(bt(blockName).GetObject(OpenMode.ForRead), BlockTableRecord)

				'Also open modelspace - we'll be adding our BlockReference to it



				Dim ms As BlockTableRecord = TryCast(bt(BlockTableRecord.ModelSpace).GetObject(OpenMode.ForWrite), BlockTableRecord)

				'Create new BlockReference, and link it to our block definition

				Dim point As New Point3d(2.0, 4.0, 6.0)


				Using blockRef As New BlockReference(point, blockDef.ObjectId)


					'Add the block reference to modelspace

					ms.AppendEntity(blockRef)

					myT.AddNewlyCreatedDBObject(blockRef, True)

					'Iterate block definition to find all non-constant 

					' AttributeDefinitions

					For Each id As ObjectId In blockDef


						Dim obj As DBObject = id.GetObject(OpenMode.ForRead)

						Dim attDef As AttributeDefinition = TryCast(obj, AttributeDefinition)

						If (attDef IsNot Nothing) AndAlso (Not attDef.Constant) Then


							'This is a non-constant AttributeDefinition 

							'Create a new AttributeReference

							Using attRef As New AttributeReference()


								attRef.SetAttributeFromBlock(attDef, blockRef.BlockTransform)

								attRef.TextString = "Hello World"

								'Add the AttributeReference to the BlockReference

								blockRef.AttributeCollection.AppendAttribute(attRef)


								myT.AddNewlyCreatedDBObject(attRef, True)

							End Using

						End If

					Next
				End Using

				'Our work here is done


				myT.Commit()
			End Using

		End Sub
~'o'~
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 05.07.2012, 11:13
#4
2san


 
Регистрация: 15.11.2011
Сообщений: 11


на вашем примере у меня в строчке
Код:
[Выделить все]
Dim ms As BlockTableRecord = TryCast(bt(BlockTableRecord.ModelSpace).GetObject(OpenMode.ForWrite), BlockTableRecord)
происходит эксепшн "eLockViolation"
2san вне форума  
 
Непрочитано 05.07.2012, 11:47
#5
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Цитата:
Сообщение от 2san Посмотреть сообщение
происходит эксепшн "eLockViolation"
Тогда добавь
Код:
[Выделить все]
using lockdoc as DocumentLock = doc.Lockdocument
using myT as Transaction = .....
[  Остальной код  ]
end using
end using
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 05.07.2012, 13:21
#6
2san


 
Регистрация: 15.11.2011
Сообщений: 11


добавил. получилось все тоже самое что и в моем коде. атрибуты на месте по умолчанию для блока. т.е. не сдвигаются.

ps
в моем первоначальном коде тоже есть LockDocument. кусок не скопирвовал когда вставлял..
2san вне форума  
 
Непрочитано 05.07.2012, 16:42
1 | #7
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Цитата:
Сообщение от 2san Посмотреть сообщение
добавил. получилось все тоже самое что и в моем коде. атрибуты на месте по умолчанию для блока. т.е. не сдвигаются.
Попробуй добавить одну строчку:

Код:
[Выделить все]
attRef.SetAttributeFromBlock(attDef, blockRef.BlockTransform)
attRef.Position = attDef.Position + point.GetAsVector()
attRef.AdjustAlignment(db)

Последний раз редактировалось Олег (jr.), 05.07.2012 в 22:15.
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 05.07.2012, 16:58
#8
2san


 
Регистрация: 15.11.2011
Сообщений: 11


результат тот же. не помогло
2san вне форума  
 
Непрочитано 05.07.2012, 22:16
#9
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813



Смотри выше
Олег (jr.) вне форума  
 
Непрочитано 05.07.2012, 23:08
#10
bargool


 
Регистрация: 16.08.2006
Санкт-Петербург
Сообщений: 508
<phrase 1=


А может так?
Код:
[Выделить все]
 Vector3d displacement = new Vector3d(0, 3, 0);
attRef.SetAttributeFromBlock(attDef,
	                       blockRef
	                       .BlockTransform
	                       .PostMultiplyBy(Matrix3d.Displacement(displacement)));
Хотя, тогда смещение будет ещё и скалировано на масштаб вхождения блока. Тогда вектор надо ещё поделить на масштаб вхождения блока.

Последний раз редактировалось bargool, 05.07.2012 в 23:13. Причина: добавил про масштабирования
bargool вне форума  
 
Автор темы   Непрочитано 06.07.2012, 00:03
#11
2san


 
Регистрация: 15.11.2011
Сообщений: 11


методом научного тыка выяснил что для смещения атрибутов надо использовать не свойство Position, а свойство AlignmentPoint
все получилось.
Код:
[Выделить все]
AttRef.AlignmentPoint = AttRef.AlignmentPoint + New Vector3d(0, 3, 0)
спасибо за помощь!
2san вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > вставка блока со смещенными атрибутами в .NET

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вставка блока "Высотная отметка" Danger_pgs Программирование 20 18.02.2016 10:06
C# .net переопределение динамического блока из внешнего файла bargool .NET 35 18.10.2011 16:03
Программная вставка блока с атрибутами в таблицу. Как сохранить установленные значения атрибутов? Кулик Алексей aka kpblc Программирование 8 22.07.2010 15:01
Подсчет кабеля при помощи дин. блока с атрибутами serg01 AutoCAD 41 07.05.2009 09:34