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

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

Автоматическая вставка блока вместо полилиний с соответствующим масштабом и углом поворота

Ответ
Поиск в этой теме
Непрочитано 03.07.2015, 11:46 #1
Автоматическая вставка блока вместо полилиний с соответствующим масштабом и углом поворота
Viatcheslav
 
Регистрация: 03.06.2015
Сообщений: 5

Доброго времени суток!

Отчаянно прошу помощи.
Есть схема газовых сетей города, нарисованная по большей части полилиниями. Сам газопровод - полилинии, а запорная арматура и другие точечные объекты нарисованы в блоках. В соответствии с новыми стандартами газопровод тоже должен быть нанесен в виде блока.

Вопрос:
Как можно автоматизировать процесс замены полилиний на заданный блок средствами Lisp (или другими языками)? Можно ли при вставке блока считывать у полилинии угол поворота и длину, и задавать соответствующие значения в блок? И вообще в какую сторону копать посоветуете?

Спасибо!

PS: Нашел fas-файил который вставляет заданный блок в вершину полилиний, но мне надо чтобы он по x смасштабировал (в соотвествии с длиной полилинии) и угол поворота сделал такой же.
Просмотров: 4583
 
Непрочитано 03.07.2015, 11:49
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426


Полилинию загони в блок и все.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.07.2015, 11:56
#3
trir


 
Регистрация: 18.12.2010
Сообщений: 5,108


Извращенцы, используйте ГИС!!!
trir вне форума  
 
Автор темы   Непрочитано 03.07.2015, 13:08
#4
Viatcheslav


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Полилинию загони в блок и все.
Мы должны нарисовать газопровод теми блоками которые присланы в образце в стандарте. Тип блока для всех участков гп (в рамках одного вида гп) должен быть один. Участки гп должны быть отдельными блоками (одного типа), у каждой свой id.
Или есть способ вставить полилинии в определенный (уже заданный в dwg-файле) тип блока, а не как новый?

Цитата:
Сообщение от trir Посмотреть сообщение
Извращенцы, используйте ГИС!!!
Полностью согласен. К сожалению вышестоящая организация (которая штампует стандарты) этого не понимает.

Последний раз редактировалось Viatcheslav, 03.07.2015 в 13:13.
Viatcheslav вне форума  
 
Непрочитано 04.07.2015, 11:44
#5
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от Viatcheslav Посмотреть сообщение
Как можно автоматизировать процесс замены полилиний на заданный блок средствами Lisp
Вместо каждого линейного сегмента полилинии вставить блок, повернуть на угол, длину задать как
1. если динамический блок как соответствующий параметр
2. если блок обычный как масштаб по X=длине сегмента
Для более конкретных рекомендаций нужно видеть те блоки,
Цитата:
Сообщение от Viatcheslav Посмотреть сообщение
которые присланы в образце в стандарте
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 06.07.2015, 09:20
#6
Viatcheslav


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


Цитата:
Сообщение от VVA Посмотреть сообщение
Вместо каждого линейного сегмента полилинии вставить блок, повернуть на угол, длину задать как
1. если динамический блок как соответствующий параметр
2. если блок обычный как масштаб по X=длине сегмента
Для более конкретных рекомендаций нужно видеть те блоки,
Спасибо, что откликнулись!
Блоки, насколько я понимаю, не динамические. В файле стандартных обозначений они проходят под именами: l0, l05, l1 (в зависимости от категории давления). Я так понял, рисование блоками сводится к масштабированию этих блоков по X (по Y остается 1:1), точных комментарий от авторов стандарта на этот счет не было.
Вложения
Тип файла: dwg
DWG 2007
USL_OBOZN_RS_итог.dwg (321.5 Кб, 645 просмотров)
Viatcheslav вне форума  
 
Автор темы   Непрочитано 08.07.2015, 17:00
#7
Viatcheslav


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


Пытаюсь разобраться с VBA-кодом вставки блоков в вершины полилинии:

Код:
[Выделить все]
Option Explicit

Public Sub InsertBlocksEX(sBlockName As String, dXScale As Double, _
dYScale As Double, dZScale As Double, dRotation As Double)   
  'Dim objPline As AcadPolyline
  Dim objPline As AcadLWPolyline
  Dim objSelSet As AcadSelectionSet
  Dim intVCnt As Integer
  Dim intType(0) As Integer
  Dim varData(0) As Variant
  Dim retCoord As Variant
  Dim intCnt As Integer
  Dim varVert As Variant
  Dim varPnt As Variant
  Dim varCord As Variant
  Dim varNext As Variant
  Dim varMid As Variant
  Dim intCrdCnt As Integer

  On Error GoTo Exit_Sub
  intType(0) = 0
  'varData(0) = "POLYLINE"
  varData(0) = "LWPOLYLINE"
  Set objSelSet = vbdPowerSet("inserts")
  objSelSet.SelectOnScreen intType, varData
  For Each objPline In objSelSet
    retCoord = objPline.Coordinates
    intCnt = 1
    For Each varVert In retCoord
      intVCnt = intVCnt + 1
    Next
    'For intCrdCnt = 0 To intVCnt / 3 - 1 'For Poly
    For intCrdCnt = 0 To intVCnt / 2 - 1 'For LWPoly
      varCord = objPline.Coordinate(intCrdCnt)
      ReDim Preserve varCord(2)
      varCord(2) = objPline.Elevation
      If ThisDrawing.ActiveSpace = acModelSpace Then
        ThisDrawing.ModelSpace.InsertBlock varCord, sBlockName, _
        dXScale, dYScale, dZScale, dRotation
      Else
        ThisDrawing.PaperSpace.InsertBlock varCord, sBlockName, _
        dXScale, dYScale, dZScale, dRotation
      End If
    Next
  Next
Exit_Sub:
End Sub

Public Function vbdPowerSet(strName As String) As AcadSelectionSet
  Dim objSelSet As AcadSelectionSet
  Dim objSelCol As AcadSelectionSets
  Set objSelCol = ThisDrawing.SelectionSets
    For Each objSelSet In objSelCol
      If objSelSet.Name = strName Then
        ThisDrawing.SelectionSets.Item(strName).Delete
        Exit For
      End If
    Next
  Set objSelSet = ThisDrawing.SelectionSets.Add(strName)
  Set vbdPowerSet = objSelSet
End Function

Public Sub TEST_InsertBlocksEX()
  'Be sure to change the block name and info!
  InsertBlocksEX "l0", 1, 1, 1, 0
End Sub

Private Sub UserForm_Click()

End Sub
Функцию "InsertBlocksEX", которая принимает в качестве аргументов имя блока, скалирование по x, y и угол поворота, можно как-то переделать чтобы все эти параметры вставки блока (за исключением имени естественно) динамически менялись для каждого блока в соответствии с участком полилинии в которую они(блоки) вставляются.

Я так понимаю в этих строчках надо внести изменения:
Код:
[Выделить все]
If ThisDrawing.ActiveSpace = acModelSpace Then
        ThisDrawing.ModelSpace.InsertBlock varCord, sBlockName, _
        dXScale, dYScale, dZScale, dRotation
      Else
        ThisDrawing.PaperSpace.InsertBlock varCord, sBlockName, _
        dXScale, dYScale, dZScale, dRotation
      End If
Но как обратиться к определенному отрезку полилинии и "выдернуть" оттуда угол поворота и длину?
Прошу помощи спецов.
Viatcheslav вне форума  
 
Непрочитано 08.07.2015, 21:27
#8
trir


 
Регистрация: 18.12.2010
Сообщений: 5,108


У полилинии есть список координат вершин
Длина находится из уравнения Пифагора (был такой чел в древней Греции)
Длина = sqrt(dx^2+dy^2)
Угол:

где k:

ну и можно так

Последний раз редактировалось trir, 08.07.2015 в 21:34.
trir вне форума  
 
Автор темы   Непрочитано 09.07.2015, 13:32
#9
Viatcheslav


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


Спасибо! Все получилось.

Я просто изначально пытался обратиться к свойствам определенного сегмента полилинии, оказалось все проще.

----- добавлено через ~28 мин. -----
Еще вопрос:

В одну выделенную полилинию блоки вставляются хорошо, но если выделяешь несколько, то в остальных (pline) ничего не вставляется. Хотя в коде в строчке:
Код:
[Выделить все]
For Each objPline In objSelSet       
    retCoord = objPline.Coordinates       
    intCnt = 1
вроде учитываются все полилинии выделенные. Ситуация осложняется еще тем, что с VBA не дружу особо.
Viatcheslav вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Автоматическая вставка блока вместо полилиний с соответствующим масштабом и углом поворота



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не удается выполнить копирование / вставку элементов чертежа Gamer777 AutoCAD 269 10.01.2023 13:29
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19
Вставка блока на концы полилиний перпендикулярно им Karloson1 Программирование 10 14.12.2014 17:42