Победа штриховки надо мной

Автор Тема: Победа штриховки надо мной  (Прочитано 24992 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 0
  • Воспитываю из него программиста
Вероятнее всего уже много раз обсуждали, но тем не менее открою эту тему, проблема с площадью штриховки, которая лично мне нужна до зарезу, по причине того, что мне нужна площадь фасада зашитого в блок, а фасад содержит все обычные элементы в больших количествах, поэтому boundary я воспользоваться не могу, ребята, помощь нужна любая, прикладываю картинку, чтобы вы видели площадь какого блока нужно взять!

Самое неприятное, что для элементарных объектов, типа прямоугольник, автокад прекрасно считает площадь

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Победа штриховки надо мной
« Ответ #1 : 17-10-2014, 21:44:17 »
Для начала проверь считает ли площадь этой штриховки GeomProps: http://www.maestrogroup.com.ua/support/GeomProps.zip
Дальше поговорим.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Победа штриховки надо мной
« Ответ #2 : 19-10-2014, 01:05:50 »
В любом случае только средствами Autolisp/VisualLisp ты не сможешь ничего в этой ситуации сделать. Задача должна сводиться к попытке получения контура (границы) штриховки на основе данных штриховки, а затем получение площади этой границы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 0
  • Воспитываю из него программиста
Re: Победа штриховки надо мной
« Ответ #3 : 20-10-2014, 11:00:42 »
В любом случае только средствами Autolisp/VisualLisp ты не сможешь ничего в этой ситуации сделать. Задача должна сводиться к попытке получения контура (границы) штриховки на основе данных штриховки, а затем получение площади этой границы.
обидно! очень хотелось автоматик сделать lisp, ладно будем познавать дальше иными методами

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

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 0
  • Воспитываю из него программиста
Re: Победа штриховки надо мной
« Ответ #4 : 20-10-2014, 11:08:15 »
Дальше поговорим.
Придется дальше разговаривать! Не нашел макрос площадь

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

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 0
  • Воспитываю из него программиста
Re: Победа штриховки надо мной
« Ответ #5 : 20-10-2014, 11:10:48 »
Задача должна сводиться к попытке получения контура (границы) штриховки на основе данных штриховки, а затем получение площади этой границы.
Да я это прекрасно понимаю, но вот как это сделать, странно, что нет инструмента такого встроенного в автокад! Было бы очень удобно...В идеале да нужно чтобы была команда, которая обрисовывает контур блока, и затем конечно брать площадь этой полилинии замкнутой. Но я не имею, пока, такой квалификации, чтобы написать такой макрос

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Re: Победа штриховки надо мной
« Ответ #6 : 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/
« Последнее редактирование: 21-10-2014, 06:51:27 от trir »

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

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 0
  • Воспитываю из него программиста
Re: Победа штриховки надо мной
« Ответ #7 : 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/
Я побоюсь спросить, к чему бы это?

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Re: Победа штриховки надо мной
« Ответ #8 : 20-10-2014, 14:03:44 »
У штриховки есть метод GetLoopAt - который позволяет получить контуры

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Победа штриховки надо мной
« Ответ #9 : 20-10-2014, 14:47:28 »
    Дальше поговорим.

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

Выкладывай чертеж (dwg-файл) с одной этой штриховкой. Попробую понять почему не считается её площадь и не баг ли это.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 0
  • Воспитываю из него программиста
Re: Победа штриховки надо мной
« Ответ #10 : 20-10-2014, 15:20:37 »
Файл для анализа Александром

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Победа штриховки надо мной
« Ответ #11 : 21-10-2014, 00:06:39 »
Увы, но с этой штриховкой что-то не так.
1) При попытке поменять тип штриховки на SOLID, получаю сообщение об ошибке:
Цитировать
Unable to update the solid fill.
Это с очень большой вероятностью говорит о том, что AutoCAD не может разобраться с границами штриховки.
2) Восстановить границы штриховки удается (например, при помощи команды  _hatchgenerateboundary) , но она получается какой-то неправильной, так что площадь не получить.
3) Для нормальной штриховки при её редактировании (_HATCHEDIT), выборе пункта Восстановить контур (Recreate Boundary) и выбора опции Область (Region) штриховка добавляет в чертеж в Область (Region), с такой же площадью. С этой штриховкой - полный облом.
« Последнее редактирование: 21-10-2014, 00:17:41 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Re: Победа штриховки надо мной
« Ответ #12 : 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
 

Походу здесь не хилые проблемы с топологией - фиг поймёшь где там дырки

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Победа штриховки надо мной
« Ответ #13 : 21-10-2014, 09:25:00 »
Контур состоит из "отрезков" поллиний
которые еще и не соединяются между собой.
Походу здесь не хилые проблемы с топологией - фиг поймёшь где там дырки
Точно!
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 0
  • Воспитываю из него программиста
Re: Победа штриховки надо мной
« Ответ #14 : 21-10-2014, 10:46:22 »
Склонялся к той же мысли, сейчас попросил выдать нарисованный вручную фасад, попробую его обработать lisp и макросами Александра, тем не менее благодарю за помощь в анализе штриховки