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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Почему GetBoundingBox выдаёт некорректные данные?

Почему GetBoundingBox выдаёт некорректные данные?

Ответ
Поиск в этой теме
Непрочитано 28.02.2023, 09:50 #1
Почему GetBoundingBox выдаёт некорректные данные?
Nik1598
 
Регистрация: 28.02.2023
Сообщений: 4

Всех приветствую, писал программу на VBA для AutoCAD 2022 и столкнулся с такой проблемой: У меня есть план оборудования в виде 4 отрезков и мне необходимо узнать длину и ширину, метод GetBoundingBox верно определяет все точки, кроме одной, хотя если смотреть на свойства отрезка, которому принадлежит эта точка, то с ним всё в порядке, подскажите пожалуйста, в чём может быть проблема?

Код проверки точек:
Sub Prob()
Dim l As Integer

Dim Plan As AcadEntity
Dim Kor1 As Variant
Dim Kor2 As Variant



l = 0

Do While l < ThisDrawing.ModelSpace.Count
Set Plan = ThisDrawing.ModelSpace.Item(l)

If Plan.Layer = "Plan" And Plan.ObjectName = "AcDbLine" Then


Plan.GetBoundingBox Kor1, Kor2

MsgBox "X1 = " & Kor1(0) & " Y1 = " & Kor1(1) & " X2 = " & Kor2(0) & " Y2 = " & Kor2(1)

End If

l = l + 1
Loop



End Sub

Вложения
Тип файла: dwg
DWG 2018
ec_160438.dwg (1.75 Мб, 16 просмотров)

Просмотров: 1446
 
Непрочитано 28.02.2023, 10:49
#2
Кулик Алексей aka kpblc
Moderator

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


Файл с несколькими отрезкамии на почти 2 метра?!??? И там у тебя не только отрезки, если что - еще и текст присутствует.

----- добавлено через 34 сек. -----
А, сорри, не увидел, что ты пытаешься отфильтровать отрезки.

----- добавлено через ~4 мин. -----
Какую именно точку у тебя неправильно определяет код? Хоть бы подсказал))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.02.2023, 11:31
#3
Nik1598


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Какую именно точку у тебя неправильно определяет код? Хоть бы подсказал))

Моя ошибка, надо было сразу результат показать.

Конкретно программа определяет неверно верхнюю точку левого отрезка, там вместо нуля значение, точность которого уходит в бесконечность и далее.
Миниатюры
Нажмите на изображение для увеличения
Название: 2023-02-28_11-27-46.png
Просмотров: 36
Размер:	2.6 Кб
ID:	253740  Нажмите на изображение для увеличения
Название: 2023-02-28_11-30-54.png
Просмотров: 37
Размер:	25.3 Кб
ID:	253741  
Nik1598 вне форума  
 
Непрочитано 28.02.2023, 12:00
#4
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,002


ну так создали объект. Вставляете в комстроке код
Код:
[Выделить все]
 (entget (car (entsel)))
и получаете дамп
Цитата:
Выберите объект: ((-1 . <Имя объекта: b3eb980>) (0 . "LINE") (330 . <Имя объекта: b3e79f0>) (5 . "7E0") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "Plan") (100 . "AcDbLine") (10 0.0 -600.0 0.0) (11 3.67394e-14 0.0 0.0) (210 0.0 0.0 1.0))
----- добавлено через ~8 мин. -----
кстати, забавно - видимо, в первых версиях акада было тип Integer свойства Count примитива AcadBlock (ModelSpace является его наследником по сути). И до сих пор бережно в примерах пишут переменную типа Integer цикла по пространству модели - видимо больше 32тыс элементов в пространстве модели обрабатывать не собираются)
Сергей812 вне форума  
 
Автор темы   Непрочитано 28.02.2023, 12:26
#5
Nik1598


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
ну так создали объект. Вставляете в комстроке код
Код:
[Выделить все]
(entget (car (entsel)))
и получаете дамп
Цитата:
Выберите объект: ((-1 . <Имя объекта: b3eb980>) (0 . "LINE") (330 . <Имя объекта: b3e79f0>) (5 . "7E0") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "Plan") (100 . "AcDbLine") (10 0.0 -600.0 0.0) (11 3.67394e-14 0.0 0.0) (210 0.0 0.0 1.0))

Спасибо за совет, но честно говоря я не понял, как он может мне помочь если ваш код выдал ровно те же значения...
Nik1598 вне форума  
 
Непрочитано 28.02.2023, 12:34
1 | #6
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,002


Цитата:
Сообщение от Nik1598 Посмотреть сообщение
Спасибо за совет, но честно говоря я не понял, как он может мне помочь если ваш код выдал ровно те же значения...
ну это ответ на
Цитата:
Сообщение от Nik1598 Посмотреть сообщение
если смотреть на свойства отрезка, которому принадлежит эта точка, то с ним всё в порядке, подскажите пожалуйста, в чём может быть проблема?
в отображаемых свойствах округляет значение с учетом системной переменной LUPREC, значение которой можно выставить максимум на 8 знаков после запятой. А внутри акада операции проводятся с внутренней точностью double (15-17 значащих десятичных цифр) - что и выдает как ваш код, так и дамп через лисп.
Сергей812 вне форума  
 
Автор темы   Непрочитано 28.02.2023, 12:41
#7
Nik1598


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
в отображаемых свойствах округляет значение с учетом системной переменной LUPREC, значение которой можно выставить максимум на 8 знаков после запятой. А внутри акада операции проводятся с внутренней точностью double (15-17 значащих десятичных цифр) - что и выдает как ваш код, так и дамп через лисп.
Значит оправдались мои худшие ожидания и это просто кривые модели, огромное вам спасибо за пояснения!
Nik1598 вне форума  
 
Непрочитано 28.02.2023, 12:50
#8
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,002


просто используйте функцию округления Round) Такие флуктуации на грани точности - это неизбежная плата за использование арифметики вещественных чисел с плавающей запятой.
Сергей812 вне форума  
 
Непрочитано 28.02.2023, 15:18
#9
Кулик Алексей aka kpblc
Moderator

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


10 в минус 14 степени - практически 0.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Почему GetBoundingBox выдаёт некорректные данные?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему ФОК Комплекс не выдаёт шпильки? eilukha Расчетные программы 27 02.09.2021 11:30
SCAD Office (версия 21.1.9.7). Модуль огнестойкости. Почему не совпадают результаты ручного расчета и SCAD? Constructor_AS SCAD 0 04.08.2020 12:07
Почему не отображаются данные по объемам земляных работ? sofiko Вертикальные решения на базе AutoCAD 1 16.05.2016 08:36
Как заказчик получает данные о владельцах сетей на участке стр-ва ? Tyhig Технология и организация строительства 7 19.10.2010 16:37