Тема: Динамическая вставка блока
Чтобы получить блок, "висящий на курсоре" при вставке, в Lisp/VBA используют command/SendCommand.
Как, например, здесь
SendCommand для динамической вставки блоков + обработка
А как в .Net?
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → .NET → Динамическая вставка блока
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Чтобы получить блок, "висящий на курсоре" при вставке, в Lisp/VBA используют command/SendCommand.
Как, например, здесь
SendCommand для динамической вставки блоков + обработка
А как в .Net?
Точнее и полнее http://through-the-interface.typepad.co … fro_1.html
Но мне не очень симпотизирует этот вариант. На мой взгляд DrawJig лучше справляется с этим вопросом, нежели EntityJig
Тут готовое решение Вашей проблемы,
Jig вставка блока с атрибутами :
http://through-the-interface.typepad.co … g-net.html
Тут готовое решение Вашей проблемы,
Jig вставка блока с атрибутами :
http://through-the-interface.typepad....g-net.html
Тут тоже пример с EntityJig. Я конечно досконально не тестировал и не проверял, но по-моему, если использовать DrawJig, то проблем с атрибутами и не будет.
А пример с DrawJig есть?
Нет вроде. Но если разобраться (я вас имею ввиду), то можете сам сделать ;)
А если вечером мне не будет лень - могу накидать примерчик :)
Но если разобраться (я вас имею ввиду), то можете сам сделать
Я только начинаю .Net осваивать.
Точнее и полнее http://through-the-interface.typepad....fro_1.html
Но мне не очень симпотизирует этот вариант. На мой взгляд DrawJig лучше справляется с этим вопросом, нежели EntityJig
Тут готовое решение Вашей проблемы,
Jig вставка блока с атрибутами :
http://through-the-interface.typepad....g-net.html
В первой ссылке есть многократная вставка блока, но выход только по Esc, по второй - вставляется один блок.
А как сделать многократную вставку, с выходом по Enter/right click?
do {} while ()
MSDN в помощь!
З.Ы. Можешь полазить по сайту, на который дали ссылки, посмотреть в разных примерах - там много чего можно найти. В том числе и этот вопрос
Взял этот пример (Jigging an AutoCAD block with attributes using .NET)
Тут готовое решение Вашей проблемы,
Jig вставка блока с атрибутами :
http://through-the-interface.typepad....g-net.html
и переделал под свои запросы (многократная вставка блока с выходом по Enter; переписано на VB.Net)
Да простит меня Kean Walmsley за издевательство над его кодом.
В Class BlockJig, в функции Sampler заменил
UserInputControls.NoZeroResponseAccepted
на
UserInputControls.Accept3dCoordinates Or UserInputControls.AcceptOtherInputString
Переделанный Class Commands
Public Class Commands Public Shared Sub BlockJigCmd(ByVal bnam, ByVal attr_arr, ByVal ub) Dim doc As Document = Application.DocumentManager.MdiActiveDocument Dim db As Database = doc.Database Dim ed As Editor = doc.Editor Dim promptResult As PromptResult 'Dim attr_arr() As String = attr_arro 'Dim cnt As Integer Do Dim tr As Transaction = doc.TransactionManager.StartTransaction() Using tr Dim bt As BlockTable = DirectCast(tr.GetObject(db.BlockTableId, OpenMode.ForRead), BlockTable) If Not bt.Has(bnam) Then ed.WriteMessage(vbLf & "Block " & bnam & " not found.") Return End If Dim space As BlockTableRecord = _ DirectCast(tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord) Dim btr As BlockTableRecord = _ DirectCast(tr.GetObject(bt(bnam), OpenMode.ForRead), BlockTableRecord) ' Block needs to be inserted to current space before being able to append attribute to it Dim br As New BlockReference(New Point3d(), btr.ObjectId) space.AppendEntity(br) tr.AddNewlyCreatedDBObject(br, True) Dim attInfo As New Dictionary(Of ObjectId, AttInfo)() If btr.HasAttributeDefinitions Then For Each id As ObjectId In btr Dim obj As DBObject = tr.GetObject(id, OpenMode.ForRead) Dim ad As AttributeDefinition = TryCast(obj, AttributeDefinition) If ad IsNot Nothing AndAlso Not ad.Constant Then Dim ar As New AttributeReference() ar.SetAttributeFromBlock(ad, br.BlockTransform) ar.Position = ad.Position.TransformBy(br.BlockTransform) If ad.Justify <> AttachmentPoint.BaseLeft Then _ ar.AlignmentPoint = ad.AlignmentPoint.TransformBy(br.BlockTransform) If ar.IsMTextAttribute Then ar.UpdateMTextAttribute() For i = 0 To ub If ar.Tag = attr_arr(0, i) Then ar.TextString = attr_arr(1, i) : Exit For Next Dim arId As ObjectId = br.AttributeCollection.AppendAttribute(ar) tr.AddNewlyCreatedDBObject(ar, True) ' Initialize our dictionary with the ObjectId of the attribute reference + attribute definition info attInfo.Add(arId, New AttInfo(ad.Position, ad.AlignmentPoint, ad.Justify <> AttachmentPoint.BaseLeft)) End If Next End If ' Run the jig Dim myJig As New BlockJig(tr, br, attInfo) promptResult = ed.Drag(myJig) If promptResult.Status <> PromptStatus.OK Then Return tr.Commit() ' Commit changes End Using Loop End Sub End Class
Запуск идет из
Public Class main_class <CommandMethod("BJ")> _ Public Sub main() Dim bnam = "myblockname" Dim ub As Integer = 1 ' UBound of the array 'массив: тэги аттрибутов / значения аттрибутов Dim attr_arr(1, ub) As String attr_arr(0, 0) = "Tag1" : attr_arr(0, 1) = "Tag2" attr_arr(1, 0) = "xx" : attr_arr(1, 1) = "yy" Commands.BlockJigCmd(bnam, attr_arr, ub) End Sub End Class
Буду благодарен за замеченные недостатки и способы их устранения.
И вопрос:
как передать двухмерный массив в виде параметра в процедуру?
А то пришлось все параметры передавать как Object.
вопрос:
как передать двухмерный массив в виде параметра в процедуру?
Ответ самому себе.
Получилось так:
Public Shared Sub BlockJigCmd(ByVal bnam As String, ByVal attr_arr(,) As String) .................... Dim ub As Integer = attr_arr.GetUpperBound(1) ....................
Вызов
Commands.BlockJigCmd(bnam, attr_arr)
Но если разобраться (я вас имею ввиду), то можете сам сделать
Я только начинаю .Net осваивать.
Начинать осваивание дотнета с написания плагинов в автокаде - не самый лучший выбор. Лучше начинать с банального консольного "Hello World". Обёртки над ObjectArx написаны автодеском не лучшим образом. Если будешь изучать дотнет на примере работы с ними - это может негативно сказаться на дальнейшем стиле твоего программирования.
имхо.
Начинать осваивание дотнета с написания плагинов в автокаде - не самый лучший выбор. Лучше начинать с банального консольного "Hello World". Обёртки над ObjectArx написаны автодеском не лучшим образом.
Да я и начал с этого, уже потом стал пробовать что-то сделать в автокаде.
Но конечная цель - перейти с VBA (с которым уже лет 10) на VB.Net.
Насчет того, что AutoCad .Net API не идеален, уже читал на форуме, но, как говорит гуру А.Ривилис, лучше использовать .Net API, чем ActiveX, т.е. из двух зол выбрал меньшее.
Приветствую! Уважаемые, имеется задача подобным образом (как для выше рассмотренных атрибутов) обработать свойства блока, т.е. динамически откорректировать его элементы в процессе вставки.
Есть такой код, который позволяет менять свойства:
br =new BlockReference(new Point3d(),bt["Наш блок"]);
if (br.IsDynamicBlock)
{
//Получаем коллекцию динамических свойств
foreach (DynamicBlockReferenceProperty prop in br.DynamicBlockReferencePropertyCollection )
{
if (prop.PropertyName == "Наше свойство")
{
prop.Value = newValue;
}
}
}
...
tr.Commit
:idea: Но изменения происходят после вставки, помогите реализовать свойства в : EntityJig :cry: .
Похоже нет решения? EntityJig довольно ограниченная вещь?! Нашел примеры по растяжению, кручению и прочее - но это относится ко всему блоку. Как поменять отобразить изменения его составных частей, пока он "висит на курсоре"? :?:
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → .NET → Динамическая вставка блока
Форум работает на PunBB, при поддержке Informer Technologies, Inc