Сообщество программистов Autodesk в СНГ

ADN Club => AutoLisp / VisualLISP и DCL => Тема начата: Peacemaker_kiss от 17-10-2014, 19:27:16

Название: Победа штриховки надо мной
Отправлено: Peacemaker_kiss от 17-10-2014, 19:27:16
Вероятнее всего уже много раз обсуждали, но тем не менее открою эту тему, проблема с площадью штриховки, которая лично мне нужна до зарезу, по причине того, что мне нужна площадь фасада зашитого в блок, а фасад содержит все обычные элементы в больших количествах, поэтому boundary я воспользоваться не могу, ребята, помощь нужна любая, прикладываю картинку, чтобы вы видели площадь какого блока нужно взять!
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fi6.pixs.ru%2Fthumbs%2F4%2F2%2F0%2FBezimyanni_5566332_14310420.jpg&hash=fef33396d6184fc51de6482a690e8850) (http://pixs.ru/showimage/Bezimyanni_5566332_14310420.png)
Самое неприятное, что для элементарных объектов, типа прямоугольник, автокад прекрасно считает площадь
Название: Re: Победа штриховки надо мной
Отправлено: Александр Ривилис от 17-10-2014, 21:44:17
Для начала проверь считает ли площадь этой штриховки GeomProps: http://www.maestrogroup.com.ua/support/GeomProps.zip
Дальше поговорим.
Название: Re: Победа штриховки надо мной
Отправлено: Александр Ривилис от 19-10-2014, 01:05:50
В любом случае только средствами Autolisp/VisualLisp ты не сможешь ничего в этой ситуации сделать. Задача должна сводиться к попытке получения контура (границы) штриховки на основе данных штриховки, а затем получение площади этой границы.
Название: Re: Победа штриховки надо мной
Отправлено: Peacemaker_kiss от 20-10-2014, 11:00:42
В любом случае только средствами Autolisp/VisualLisp ты не сможешь ничего в этой ситуации сделать. Задача должна сводиться к попытке получения контура (границы) штриховки на основе данных штриховки, а затем получение площади этой границы.
обидно! очень хотелось автоматик сделать lisp, ладно будем познавать дальше иными методами
Название: Re: Победа штриховки надо мной
Отправлено: Peacemaker_kiss от 20-10-2014, 11:08:15
Дальше поговорим.
Придется дальше разговаривать! Не нашел макрос площадь
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg.pixs.ru%2Fthumbs%2F2%2F0%2F6%2FBezimyanni_2642130_14350206.jpg&hash=856e75180c60d5d590118be8aa10f442) (http://pixs.ru/showimage/Bezimyanni_2642130_14350206.png)
Название: Re: Победа штриховки надо мной
Отправлено: Peacemaker_kiss от 20-10-2014, 11:10:48
Задача должна сводиться к попытке получения контура (границы) штриховки на основе данных штриховки, а затем получение площади этой границы.
Да я это прекрасно понимаю, но вот как это сделать, странно, что нет инструмента такого встроенного в автокад! Было бы очень удобно...В идеале да нужно чтобы была команда, которая обрисовывает контур блока, и затем конечно брать площадь этой полилинии замкнутой. Но я не имею, пока, такой квалификации, чтобы написать такой макрос
Название: Re: Победа штриховки надо мной
Отправлено: trir от 20-10-2014, 12:38:53
Цитировать
object.GetLoopAt Index, Loop

Object

Hatch
 The object or objects this method applies to.

Index

Integer; input-only
 A positive integer beginning with 0.

Loop

Variant (object or array of objects); output-only
 An object or array of objects that makes up the loop.

Код - Visual Basic [Выбрать]
  1. Sub Example_GetLoopAt()
  2.         ' This example creates an associative hatch in model space.
  3.         ' It then finds the objects that make up the first loop of the hatch.
  4.  
  5.         Dim hatchObj As AcadHatch
  6.         Dim patternName As String
  7.         Dim PatternType As Long
  8.         Dim bAssociativity As Boolean
  9.  
  10.         ' Define the hatch
  11.         patternName = "ANSI31"
  12.         PatternType = 0
  13.         bAssociativity = True
  14.  
  15.         ' Create the associative Hatch object
  16.         Set hatchObj = ThisDrawing.ModelSpace.AddHatch(PatternType, patternName, bAssociativity)
  17.  
  18.         ' Create the outer loop for the hatch.
  19.         ' An arc and a line are used to create a closed loop.
  20.         Dim outerLoop(0 To 1) As AcadEntity
  21.         Dim center(0 To 2) As Double
  22.         Dim radius As Double
  23.         Dim startAngle As Double
  24.         Dim endAngle As Double
  25.         center(0) = 5: center(1) = 3: center(2) = 0
  26.         radius = 3
  27.         startAngle = 0
  28.         endAngle = 3.141592
  29.         Set outerLoop(0) = ThisDrawing.ModelSpace.AddArc(center, radius, startAngle, endAngle)
  30.         Set outerLoop(1) = ThisDrawing.ModelSpace.AddLine(outerLoop(0).startPoint, outerLoop(0).endPoint)
  31.        
  32.         ' Append the outer loop to the hatch object
  33.         hatchObj.AppendOuterLoop (outerLoop)
  34.  
  35.         ' Append the first circle as one inner loop
  36.         Dim innerLoop1(0) As AcadEntity
  37.         center(0) = 5: center(1) = 4.5: center(2) = 0
  38.         radius = 1
  39.         Set innerLoop1(0) = ThisDrawing.ModelSpace.AddCircle(center, radius)
  40.         hatchObj.AppendInnerLoop (innerLoop1)
  41.  
  42.         ' Append the second circle as the other inner loop
  43.         Dim innerLoop2(0) As AcadEntity
  44.         radius = 0.5
  45.         Set innerLoop2(0) = ThisDrawing.ModelSpace.AddCircle(center, radius)
  46.         hatchObj.AppendInnerLoop (innerLoop2)
  47.  
  48.         ' Evaluate and display the hatch
  49.         hatchObj.Evaluate
  50.         ThisDrawing.Regen True
  51.  
  52.         ' Find the objects that make up the first loop
  53.         Dim loopObjs As Variant
  54.         hatchObj.GetLoopAt 0, loopObjs
  55.  
  56.         ' Find the types of the objects in the loop
  57.         Dim I As Integer
  58.         Dim objName As String
  59.         objName = ""
  60.         For I = LBound(loopObjs) To UBound(loopObjs)
  61.                 objName = objName & loopObjs(I).EntityName & ", "
  62.         Next
  63.  
  64.         MsgBox "The objects in the first loop of the hatch are: " & objName, , "GetLoopAt Example"
  65.          
  66. End Sub
http://entercad.ru/acadauto.en/
Название: Re: Победа штриховки надо мной
Отправлено: Peacemaker_kiss от 20-10-2014, 13:42:04
Цитировать
object.GetLoopAt Index, Loop

Object

Hatch
 The object or objects this method applies to.

Index

Integer; input-only
 A positive integer beginning with 0.

Loop

Variant (object or array of objects); output-only
 An object or array of objects that makes up the loop.

Sub Example_GetLoopAt()
' This example creates an associative hatch in model space.
' It then finds the objects that make up the first loop of the hatch.

Dim hatchObj As AcadHatch
Dim patternName As String
Dim PatternType As Long
Dim bAssociativity As Boolean

' Define the hatch
patternName = "ANSI31"
PatternType = 0
bAssociativity = True

' Create the associative Hatch object
Set hatchObj = ThisDrawing.ModelSpace.AddHatch(PatternType, patternName, bAssociativity)

' Create the outer loop for the hatch.
' An arc and a line are used to create a closed loop.
Dim outerLoop(0 To 1) As AcadEntity
Dim center(0 To 2) As Double
Dim radius As Double
Dim startAngle As Double
Dim endAngle As Double
center(0) = 5: center(1) = 3: center(2) = 0
radius = 3
startAngle = 0
endAngle = 3.141592
Set outerLoop(0) = ThisDrawing.ModelSpace.AddArc(center, radius, startAngle, endAngle)
Set outerLoop(1) = ThisDrawing.ModelSpace.AddLine(outerLoop(0).startPoint, outerLoop(0).endPoint)

' Append the outer loop to the hatch object
hatchObj.AppendOuterLoop (outerLoop)

' Append the first circle as one inner loop
Dim innerLoop1(0) As AcadEntity
center(0) = 5: center(1) = 4.5: center(2) = 0
radius = 1
Set innerLoop1(0) = ThisDrawing.ModelSpace.AddCircle(center, radius)
hatchObj.AppendInnerLoop (innerLoop1)

' Append the second circle as the other inner loop
Dim innerLoop2(0) As AcadEntity
radius = 0.5
Set innerLoop2(0) = ThisDrawing.ModelSpace.AddCircle(center, radius)
hatchObj.AppendInnerLoop (innerLoop2)

' Evaluate and display the hatch
hatchObj.Evaluate
ThisDrawing.Regen True

' Find the objects that make up the first loop
Dim loopObjs As Variant
hatchObj.GetLoopAt 0, loopObjs

' Find the types of the objects in the loop
Dim I As Integer
Dim objName As String
objName = ""
For I = LBound(loopObjs) To UBound(loopObjs)
objName = objName & loopObjs(I).EntityName & ", "
Next

MsgBox "The objects in the first loop of the hatch are: " & objName, , "GetLoopAt Example"

End Sub
http://entercad.ru/acadauto.en/
Я побоюсь спросить, к чему бы это?
Название: Re: Победа штриховки надо мной
Отправлено: trir от 20-10-2014, 14:03:44
У штриховки есть метод GetLoopAt - который позволяет получить контуры
Название: Re: Победа штриховки надо мной
Отправлено: Александр Ривилис от 20-10-2014, 14:47:28
    Дальше поговорим.

Придется дальше разговаривать! Не нашел макрос площадь

Выкладывай чертеж (dwg-файл) с одной этой штриховкой. Попробую понять почему не считается её площадь и не баг ли это.
Название: Re: Победа штриховки надо мной
Отправлено: Peacemaker_kiss от 20-10-2014, 15:20:37
Файл для анализа Александром
Название: Re: Победа штриховки надо мной
Отправлено: Александр Ривилис от 21-10-2014, 00:06:39
Увы, но с этой штриховкой что-то не так.
1) При попытке поменять тип штриховки на SOLID, получаю сообщение об ошибке:
Цитировать
Unable to update the solid fill.
Это с очень большой вероятностью говорит о том, что AutoCAD не может разобраться с границами штриховки.
2) Восстановить границы штриховки удается (например, при помощи команды  _hatchgenerateboundary) , но она получается какой-то неправильной, так что площадь не получить.
3) Для нормальной штриховки при её редактировании (_HATCHEDIT), выборе пункта Восстановить контур (Recreate Boundary) и выбора опции Область (Region) штриховка добавляет в чертеж в Область (Region), с такой же площадью. С этой штриховкой - полный облом.
Название: Re: Победа штриховки надо мной
Отправлено: trir от 21-10-2014, 07:14:24
Цитировать
91
     2548
 92
       33
 93
        1
 72
     1
 10
597.2846414763571
 20
178.1578161780228
 11
625.0347730094702
 21
178.1578161780228
 97
        0
 92
       48
 93
        1
 72
     1
 10
682.1803433355739
 20
450.8162548646562
 11
682.1803433355655
 21
450.816241410044
 97
        0

http://www.autodesk.com/techpubs/autocad/acad2000/dxf/hatch_dxf_06.htm
http://www.autodesk.com/techpubs/autocad/acad2000/dxf/boundary_path_data_dxf_06.htm

Контур состоит из "отрезков" поллиний
но самое весёлое это код 92

Цитировать

Boundary path type flag (bit coded):
0 = Default; 1 = External; 2 = Polyline;
4 = Derived; 8 = Textbox; 16 = Outermost
 

Походу здесь не хилые проблемы с топологией - фиг поймёшь где там дырки
Название: Re: Победа штриховки надо мной
Отправлено: Александр Ривилис от 21-10-2014, 09:25:00
Контур состоит из "отрезков" поллиний
которые еще и не соединяются между собой.
Походу здесь не хилые проблемы с топологией - фиг поймёшь где там дырки
Точно!
Название: Re: Победа штриховки надо мной
Отправлено: Peacemaker_kiss от 21-10-2014, 10:46:22
Склонялся к той же мысли, сейчас попросил выдать нарисованный вручную фасад, попробую его обработать lisp и макросами Александра, тем не менее благодарю за помощь в анализе штриховки
Название: Re: Победа штриховки надо мной
Отправлено: Peacemaker_kiss от 21-10-2014, 11:06:04
Александр, подскажите а как бы забраться в ваше славное меню, которое создает макрос, чтобы прочитать скажем параметр площади и поместить в то место, которое необходимо, забираться планирую lisp`ом
Название: Re: Победа штриховки надо мной
Отправлено: Peacemaker_kiss от 21-10-2014, 14:19:31
Для начала проверь считает ли площадь этой штриховки GeomProps: http://www.maestrogroup.com.ua/support/GeomProps.zip
С иными штриховками, ваш макрос работает, хочу использовать информацию из вашего меню при помощи vla-GetXData, в правильном направлении следую???
Название: Re: Победа штриховки надо мной
Отправлено: Александр Ривилис от 21-10-2014, 14:21:07
в правильном направлении следую???
Совершенно мимо.
Название: Re: Победа штриховки надо мной
Отправлено: Peacemaker_kiss от 21-10-2014, 14:22:52
Совершенно мимо.
Подскажите в какую сторону от камня на распутье двигаться!
Название: Re: Победа штриховки надо мной
Отправлено: Peacemaker_kiss от 21-10-2014, 14:24:09
Все дело в том, что знать их глядя в свойтсва объекта мне очень мало, мне эти цифры нужно в таблицу перенаправлять а дальше в excel файл, но начнем с тем, чтобы в таблицу их взять с помощью lisp, в принципе возможно ли это?
Название: Re: Победа штриховки надо мной
Отправлено: Александр Ривилис от 21-10-2014, 14:28:28
GeomProps экспортирует в AutoCAD следующие lisp-функции:
Код - Auto/Visual Lisp [Выбрать]
  1. (GeomPropsGetPerimiter <имя примитива>)
  2. (GeomPropsGetArea <имя примитива>)
  3. (GeomPropsGetVolume <имя примитива>)
Можешь проверить такой код (введешь в его в командную строку AutoCAD):
Код - Auto/Visual Lisp [Выбрать]
  1. (GeomPropsGetArea (car (entsel "\nВыберите штриховку: ")))
Название: Re: Победа штриховки надо мной
Отправлено: Peacemaker_kiss от 21-10-2014, 14:30:24
Блестяще, спасибо!
Название: Re: Победа штриховки надо мной
Отправлено: Александр Ривилис от 21-10-2014, 14:31:20
Блестяще, спасибо!
А читать Readme.txt не пробовал? Там это есть.
Название: Re: Победа штриховки надо мной
Отправлено: Peacemaker_kiss от 21-10-2014, 14:42:42
А читать Readme.txt не пробовал? Там это есть.
Воистину есть! к сожалению не читал!
Название: Re: Победа штриховки надо мной
Отправлено: Александр Ривилис от 21-10-2014, 14:44:31
к сожалению не читал!
А как ты догадался какой ARX-файл нужно грузить и где смотреть площадь? ;-)
Название: Re: Победа штриховки надо мной
Отправлено: Peacemaker_kiss от 21-10-2014, 14:45:30
Файл по версии, а смотреть по логики!
Название: Re: Победа штриховки надо мной
Отправлено: Peacemaker_kiss от 21-10-2014, 14:48:52
Не долго музыка играла....Снова сложность у теперь уже не программная, в прикрепленном файле блок его штриховка и контур, которым я обвел сам блок....Площади штриховки и блока разные абсолютно :(
Название: Re: Победа штриховки надо мной
Отправлено: Peacemaker_kiss от 21-10-2014, 14:51:35
что самое удивительное, если взять тупо квадрат то они совпадут! вся проблема именно в сложноформенных блоках!
Название: Re: Победа штриховки надо мной
Отправлено: Александр Ривилис от 21-10-2014, 14:59:48
что самое удивительное, если взять тупо квадрат то они совпадут! вся проблема именно в сложноформенных блоках!
Проблема в голове. Тебе какая площадь нужна? Внешнего контура? Судя по всему у тебя на фасадах/сечениях проемы, площадь которых в штриховке (если она нормальная) не учитывается. Это та топология, о которой писал trir.
P.S.: Блок не имеет площади вообще. В принципе не имеет. Так что прекрати говорить о площади блока. Можно говорить о площади штриховки, полилинии, поверхности, но нельзя говорить о площади блока в котором может быть что угодно. У тебя там вообще отдельные отрезки, которые плоские и поэтому площади не имеют (!!!) вообще.
Название: Re: Победа штриховки надо мной
Отправлено: Peacemaker_kiss от 21-10-2014, 15:30:29
С головой проблем нет, считаю не зачем переходить на уровень дна общества и оскорблять. Мне нужно решить задачу. Мне нужна площадь внешнего контура. Возможно я выражаюсь не всегда доступно, но всегда лояльно отношусь к критике, когда она не переходит рамки приличия! Прошу помощи в решение задачи! Блок занимает пространство модели, по логике у него есть площадь, давайте перейдем к вопросу, как же опоясать блок внешним контуром, чтобы потом перейти к нахождению его площади, перепробовал многое, пришел к мысли, что поможет штриховка, оказалось не помогла. Есть идем?
Название: Re: Победа штриховки надо мной
Отправлено: Александр Ривилис от 21-10-2014, 15:42:01
Я не собирался тебя оскорблять. Если обиделся - прошу прощения. Постараюсь в будущем быть корректнее. Я лишь имел в виду, что ты или не понимаешь задачу или не объясняешь её.
Мне нужна площадь внешнего контура.
Вот это и есть постановка задачи. У тебя на входе блок состоящий из отдельных отрезков?
Название: Re: Победа штриховки надо мной
Отправлено: Peacemaker_kiss от 21-10-2014, 15:44:48
Блок может состоять из отдельных отрезков, а может из полилиний
Вроде как победа
http://www.caduser.ru/forum/index.php?PAGE_NAME=read&FID=44&TID=32529
Сейчас потестирую, сей макрос рисует как раз внешний контур вокруг блока а дальше дело техники
Название: Re: Победа штриховки надо мной
Отправлено: Peacemaker_kiss от 21-10-2014, 15:47:45
Работает через раз!!!)))
Название: Re: Победа штриховки надо мной
Отправлено: Peacemaker_kiss от 21-10-2014, 15:49:36
Код хороший, но он находит все контуры все объектов внутри блока, а мне нужен лишь внешний. Без Вас, я чувствую победы не видать
Название: Re: Победа штриховки надо мной
Отправлено: Александр Ривилис от 21-10-2014, 15:51:48
Попробуй этот код: http://forum.dwg.ru/showpost.php?p=668619&postcount=17
Предварительно я так понимаю блок придется расчленить.
Название: Re: Победа штриховки надо мной
Отправлено: Александр Ривилис от 21-10-2014, 15:54:58
Код хороший, но он находит все контуры все объектов внутри блока, а мне нужен лишь внешний. Без Вас, я чувствую победы не видать
:) Итак ты получил набор контуров, один из которых внешний. Как определить какой из них внешний? Ответ очевиден - у него максимальная площадь.

Название: Re: Победа штриховки надо мной
Отправлено: Peacemaker_kiss от 21-10-2014, 16:31:43
http://www.caduser.ru/forum/index.php?PAGE_NAME=message&FID=44&TID=32529&MID=186055#message186055
Вроде как это все делает то, что мне нужно! и без разбивки блоков, немного странно работает, но работает, что радует, ибо замороченная миссия у кода
Название: Re: Победа штриховки надо мной
Отправлено: Александр Ривилис от 21-10-2014, 16:35:22
Это там где команда DEN? Похоже ты дал неправильную ссылку. Тот код работает только для текстов.
Название: Re: Победа штриховки надо мной
Отправлено: Peacemaker_kiss от 21-10-2014, 16:41:01
Да, наврал, прошу прощенья
http://www.caduser.ru/forum/index.php?PAGE_NAME=read&FID=44&TID=32529&PAGEN_1=2
вот код
тестировал на нем