Тема: Как по координатам из метода GetBoundingBox уменьшить размер окна до этих координат?
2 CADHELP
извините за назойливость , но никак не могу понять как по координатам из метода GetBoundingBox уменьшить размер окна до этих координат???????
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → VBA → Как по координатам из метода GetBoundingBox уменьшить размер окна до этих координат?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
2 CADHELP
извините за назойливость , но никак не могу понять как по координатам из метода GetBoundingBox уменьшить размер окна до этих координат???????
Кажется алгоритм найден, в четверг попробую реализовать.Основан то ли на глюке метода SelectByPolygon, то ли на хитрой задумке разработчиков AutoCada.Вкратце:
1.Высчитываем какая из сторон прямоугольника > ширина или высота.
2.Делаем ZoomPickWindow и по границе большей стороны рисуем линию.
3.Уменьшаем ширину или высоту окна(в зависимости от того что меньше) до тех пор пока SelectByPolygon этой линии не станет равным нулю . Это значит, что окно стало размеров исходного прямоугольника.
зачем так сложно??
вычисли соотношение ширины к высоте (обьекта).Для етого ширину подели на высоту :)
Затем поменяй Ширину окна
ThisDrawing.Width = ThisDrawing.Width * (X/Y)
апотом просто Application.ZoomWindow minP, maxP
при етом ортогогональные стороны могут оказаться не видимыми так-как проходят по самому краю окна. Тем не мение ето не мешает создать нормальный wmf
М-м-м... Но из каких соображений вы высчитываете так ширину?
просто приравниваю соотношение окна к соотношению обьекта
допустим у вас прямоугольник 50 по X и 20 по Y, соотношение сторон будет 50/20=2.5
теперь меняем окно чертежа
ThisDrawing.Width = ThisDrawing.Height * 2.5
вот я лично не понимаю, смотри
мы делаем вначале zoompickwindow и получаем в окне изображение объекта, который по оси X или Y
приближен "до упора" , теперь нам надо сжать окно до размеров объекта в зависимости от того , где он сжат не "до упора"(X или Y). Так вот я и не понимаю по какому-такому закону вы выбираете соотношение ширины и высоты, поскольку первый Zoom , дальше в зависиости от размеров может давать различные соотношение.
мы говорим на разных языках ??
>>zoompickwindow и получаем в окне изображение объекта, который по оси X или Y
приближен "до упора"
не надо делать ни каких зумов руками или использовать zoompickwindow
>>Так вот я и не понимаю по какому-такому закону вы выбираете соотношение ширины и высоты
>>поскольку первый Zoom , дальше в зависиости от размеров может давать различные соотношение
Зум не меняет пропорции обьекта
не надо подстраивать окно под обьект, проще растянуть окно по пропорциям обьекта и уже потом делать зум по точкам обьекта
порядок таков
1. Максимайз окно чертежа(понятно?)
2. Взять точки обьецта (понятно?)
3. Найти пропорцию обьекта (П = Ш/В) (понятно?)
4. Изменить ширину окна чертежа (ширину окна * П)(понятно?)
5. Зум по точкам (понятно?)
6. Експорт
7. Сначала
при етом не важно будет ли окно иметь размер 200х300 или 400х600, ехпорт в wmf будет все равно одинаковый, так же не важно видиш ли ты все окно или только часть его(иногда при растягивании окно чертеж может быть болше чем окно автокада)
если ты делаеш ехпорт больше чем одного раза, не забудь максимайз окно чертежа
ThisDrawing.WindowState = acMax
ваш вариант верен если прямоугольник нарисован большая сторона по вертикали, а если большая сторона по горизонтали , то сверху и снизу экспортированной картинки будут пустые места
???
да какая разница что больше???
Sub wmfEx() Dim rel As Double Dim minP, maxP Dim more As Boolean Dim ss As AcadSelectionSet ThisDrawing.WindowState = acMax Set ss = ThisDrawing.ActiveSelectionSet For i = 0 To 100000 ss.Clear ss.SelectOnScreen ss.Item(0).GetBoundingBox minP, maxP rel = (maxP(0) - minP(0)) / (maxP(1) - minP(1)) ThisDrawing.Width = ThisDrawing.Height * rel Application.ZoomWindow minP, maxP ThisDrawing.Width = ThisDrawing.Width + 5 ThisDrawing.Height = ThisDrawing.Height + 5 ThisDrawing.SendCommand "REGEN " ThisDrawing.Export "C:\" & CStr(i), "WMF", ss If MsgBox("Next?", vbYesNo) = vbNo Then Exit For ThisDrawing.WindowState = acMax Next End Sub
Да вы были абсолютно правы, хочу только сказать , что ZoomWindow не всегда корректно работает, т.е. оставляет промежутки между краем экрана и самим чертежём, поэтому я использовал ZoomObject через SendCommand
VBA vесь глючный, можете замететь что я использую ThisDrawing.SendCommand "REGEN "
птому что ThisDrawing.REGEN ни хрена не REGEN то есть он конечно REGEN но все еще в окне до его изменения. Я думаю если ты используешь ZoomObject через SendCommand то ThisDrawing.SendCommand "REGEN " можешь выкинуть, должно и без него работать
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → VBA → Как по координатам из метода GetBoundingBox уменьшить размер окна до этих координат?
Форум работает на PunBB, при поддержке Informer Technologies, Inc