Построение линий

Автор Тема: Построение линий  (Прочитано 5753 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ElfilagasАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 4
Построение линий
« : 30-09-2016, 15:46:20 »
Добрый день,
Подскажите, пожалуйста, нужно построить отрезки по заданным координатам, сделал вот так:

Код - vb.net [Выбрать]
  1.  <CommandMethod("Add_Line")>
  2.         Public Shared Sub AddLine()
  3.             Dim Point1 As Point3d = GetPoint("Начальная точка")
  4.             Dim Point2 As Point3d = GetPoint("Конечная точка")
  5.             Dim Point3 As Point3d = GetPoint("Направление выноски")
  6.             Dim Point4 As Point3d
  7.             Dim Point5 As Point3d
  8.             If Point2.X <= Point3.X Then
  9.                 Point4 = New Point3d(Point2.X + 9, Point2.Y, 0)
  10.                 Point5 = New Point3d(Point2.X + 4.5, Point2.Y, 0)
  11.             ElseIf Point2.X > Point3.X Then
  12.                 Point4 = New Point3d(Point2.X - 9, Point2.Y, 0)
  13.                 Point5 = New Point3d(Point2.X - 4.5, Point2.Y, 0)
  14.             End If
  15.            
  16.             Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  17.             Dim acCurDb As Database = acDoc.Database
  18.             Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  19.                 Dim acBlkTbl As BlockTable
  20.                 acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)
  21.                 Dim acBlkTblRec As BlockTableRecord
  22.                 acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _
  23.                                             OpenMode.ForWrite)
  24.                 Dim Line1 As Line = New Line(Point1, Point2)
  25.                 Line1.SetDatabaseDefaults()
  26.                 acBlkTblRec.AppendEntity(Line1)
  27.                 acTrans.AddNewlyCreatedDBObject(Line1, True)
  28.                 acTrans.Commit()
  29.                 Dim Line2 As Line = New Line(Point2, Point4)
  30.                 Line2.SetDatabaseDefaults()
  31.                 acBlkTblRec.AppendEntity(Line2)
  32.                 acTrans.AddNewlyCreatedDBObject(Line2, True)
  33.                 acTrans.Commit()
  34.             End Using
  35.             Dim wtd As New fAddPosition
  36.             wtd.AddPosition(Point5)
  37.         End Sub

Но отрезки появляются после отрабатывания функции "AddPosition", а должны сперва появиться отрезки, а уже потом запускаться функция. Как это исправить?
И еще один вопрос, как сделать чтобы первый отрезок строился как стандартный в Автокаде, т.е. была линия положения отрезка, соединяющая первую точку и курсор?

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Re: Построение линий
« Ответ #1 : 30-09-2016, 16:19:08 »
За одну транзакцию можно добавить несколько объектов.
Закрытие транзакции вызывайте в самом конце и один раз.
Перерисовка пространства модели происходит по завершению работы программы, попробуйте обновлять принудительно (Application.DocumentManager.MdiActiveDocument.Editor.Regen() )

Оффлайн ElfilagasАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 4
Re: Построение линий
« Ответ #2 : 03-10-2016, 11:29:08 »
Обновление не помогает, работает так же.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13880
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Построение линий
« Ответ #3 : 03-10-2016, 13:13:30 »
Убери первый вызов acTrans.Commit()
Выложи полный код.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ElfilagasАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 4
Re: Построение линий
« Ответ #4 : 03-10-2016, 13:56:59 »
Полный код:
Код - vb.net [Выбрать]
  1. <CommandMethod("Add_Line")>
  2.         Public Shared Sub AddLine()
  3.             Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  4.             Dim acCurDb As Database = acDoc.Database
  5.             Dim Point1 As Point3d = GetPoint("Начальная точка")
  6.             Dim Point2 As Point3d = GetPoint("Начало полки")
  7.             Dim Point3 As Point3d = GetPoint("Направление полки")
  8.             Dim Point4 As Point3d
  9.             Dim Point5 As Point3d
  10.             If Point2.X <= Point3.X Then
  11.                 Point4 = New Point3d(Point2.X + 9, Point2.Y, 0)
  12.                 Point5 = New Point3d(Point2.X + 4.5, Point2.Y, 0)
  13.             ElseIf Point2.X > Point3.X Then
  14.                 Point4 = New Point3d(Point2.X - 9, Point2.Y, 0)
  15.                 Point5 = New Point3d(Point2.X - 4.5, Point2.Y, 0)
  16.             End If
  17.             Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  18.                 Dim acBlkTbl As BlockTable
  19.                 acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)
  20.                 Dim acBlkTblRec As BlockTableRecord
  21.                 acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _
  22.                                             OpenMode.ForWrite)
  23.                 Dim Line1 As Line = New Line(Point1, Point2)
  24.                 Line1.SetDatabaseDefaults()
  25.                 acBlkTblRec.AppendEntity(Line1)
  26.                 acTrans.AddNewlyCreatedDBObject(Line1, True)
  27.                 Dim Line2 As Line = New Line(Point2, Point4)
  28.                 Line2.SetDatabaseDefaults()
  29.                 acBlkTblRec.AppendEntity(Line2)
  30.                 acTrans.AddNewlyCreatedDBObject(Line2, True)
  31.                 acTrans.Commit()
  32.             End Using
  33.             Dim wtd As New fAddPosition
  34.             wtd.AddPosition(Point5)
  35.         End Sub
  36.  
  37.     Public Sub AddPosition(ipt As Point3d)
  38.         Try
  39.             If ipt = Nothing Then Exit Sub
  40.             'Показываем форму для заполнения параметров. После ОК закрытия формы, вставляем блок и заполняем его параметры
  41.             sQuants = ""
  42.             Me.lblNaimLen.Text = "Символов: " & Len(Me.txtNaim.Text) & " (max - 250)"
  43.             Me.ShowDialog()
  44.             If Me.DialogResult <> Windows.Forms.DialogResult.OK Then Exit Sub
  45.             'Вставляем позицию
  46.             Dim extDB As New Database(False, True)
  47.             Dim db As Database = HostApplicationServices.WorkingDatabase
  48.             Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
  49.             Try
  50.                 If sMainDir.Length = 0 Then sMainDir = GetPrmFromIni("MAIN", "MAINDIR")
  51.                 Dim BlockFile As String = sMainDir & "\Base\xAsmPosLabel.dwg"
  52.                 extDB.ReadDwgFile(BlockFile, System.IO.FileShare.Read, True, "")
  53.                 Using tr As Transaction = extDB.TransactionManager.StartTransaction
  54.                     Dim bt As BlockTable = tr.GetObject(extDB.BlockTableId, OpenMode.ForRead, False)
  55.                     Dim blockIds As ObjectIdCollection = New ObjectIdCollection
  56.                     blockIds.Add(bt.Item(BlockName))
  57.                     Dim mapping As IdMapping = New IdMapping
  58.                     extDB.WblockCloneObjects(blockIds, db.BlockTableId, mapping, DuplicateRecordCloning.Ignore, False)
  59.                 End Using
  60.             Catch ex As Autodesk.AutoCAD.Runtime.Exception
  61.                 MsgBox(ex.Message & vbCr & ex.StackTrace)
  62.                 Exit Sub
  63.             Finally
  64.                 extDB.CloseInput(True)
  65.                 extDB.Dispose()
  66.             End Try
  67.             Dim bref As BlockReference
  68.             Using tr As Transaction = db.TransactionManager.StartTransaction
  69.                 Dim nScale As Double = Application.GetSystemVariable("DIMSCALE")
  70.                 Dim bt As BlockTable = tr.GetObject(db.BlockTableId, OpenMode.ForRead)
  71.                 Dim btr As BlockTableRecord = DirectCast(tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite, False), BlockTableRecord)
  72.                 Dim blk As BlockTableRecord = DirectCast(tr.GetObject(bt(BlockName), OpenMode.ForRead, False), BlockTableRecord)
  73.                 Dim blkId As ObjectId = blk.ObjectId
  74.                 bref = New BlockReference(ipt, blkId)
  75.                 bref.BlockUnit = UnitsValue.Millimeters
  76.                 bref.Rotation = 0
  77.                 bref.ScaleFactors = New Scale3d(nScale)
  78.                 btr.AppendEntity(bref)
  79.                 tr.AddNewlyCreatedDBObject(bref, True)
  80.                 AddEmptyAttributes(db, tr, bref)
  81.                 EditPosAttributes(db, tr, bref)
  82.                 ed.Regen()
  83.                 tr.Commit()
  84.             End Using
  85.         Catch ex As Autodesk.AutoCAD.Runtime.Exception
  86.             MsgBox(ex.Message & vbCr & ex.StackTrace)
  87.         End Try
  88.     End Sub
  89.  

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13880
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Построение линий
« Ответ #5 : 03-10-2016, 14:11:12 »
Диалог нужно вызывать в AutoCAD через Application.ShowModalDialog, а не через me.ShowDialog
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ElfilagasАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 4
Re: Построение линий
« Ответ #6 : 03-10-2016, 16:45:30 »
Хорошо.
В принципе то что линии появляются одновременно с позицией, это не так значительно, хотел узнать для себя.
Больше интересует наглядность построений, т.к. сейчас пользователи по сути тыкают три точки в пустоте. Каким-то образом можно сделать чтобы после выбора первой точки был след отрезка между ней и указателем?

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Re: Построение линий
« Ответ #7 : 03-10-2016, 16:49:27 »
Использовать BasePoint у линии...

но лучше гуглить JIG
И вот пара ссылок для начала:
http://adn-cis.org/forum/index.php?topic=7251.0
http://through-the-interface.typepad.com/through_the_interface/2010/12/jigging-an-autocad-polyline-with-arc-segments-using-net.html