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

ADN Club => AutoCAD .NET API => Тема начата: Константин Соков от 04-02-2014, 21:49:53

Название: Подбор свойства DBText.WidthFactor
Отправлено: Константин Соков от 04-02-2014, 21:49:53
Здравствуйте. В чертеже много однострочного текста, который постоянно приходится врукопашную редактировать - подбирать его ширину, чтобы он не пересекался с другими объектами (в основном это линии, полилинии и т. д.). Сначала было пробывал устанавливать значение WidthFactor исходя из длины строки (количество символов массива), потом понял что неблагодарное это дело, много нюансов нужно учитывать (высота, стиль, ...). Сейчас пробую сделать следующее - рекурсивный метод, который проверяет пересекается ли текст с другими объектами, если да, то: WidthFactor = WidthFactor - 0.05. Пробывал использовать этот  код (http://adn-cis.org/forum/index.php?topic=118.0), но что-то пока не получается. Как можно сделать проще, какие методы использовать?
Название: Re: Подбор свойства DBText.WidthFactor
Отправлено: Дмитрий Загорулькин от 05-02-2014, 10:21:42
А если так:
- получаем текст, находим объекты, с которыми он пересекается
- вычисляем границы этих объектов, находим размер свободного пространства для текста
- делим длину свободного пространства (за вычетом минимальных расстояний от текста до объектов) на длину текста - получаем значение, на которое нужно умножить текущий коэффициент ширины
- умножаем, задаем тексту новый коэффициент
Название: Re: Подбор свойства DBText.WidthFactor
Отправлено: Константин Соков от 05-02-2014, 20:53:47
Дмитрий, подскажите как найти объекты с которыми пересекается текст? InterSectWith()?
Название: Re: Подбор свойства DBText.WidthFactor
Отправлено: Дмитрий Загорулькин от 05-02-2014, 21:11:55
Прочитав первое сообщение, я почему-то подумал, что это уже сделано :)
Я бы, наверное, вычислил габариты текста и выбрал объекты, попадающие в этот габарит секущей рамкой. Метод имеет недостатки, но это самое простое что приходит в голову.
Название: Re: Подбор свойства DBText.WidthFactor
Отправлено: Константин Соков от 05-02-2014, 21:28:57
вычислил габариты текста и выбрал объекты
Как это сделать? :-[
Название: Re: Подбор свойства DBText.WidthFactor
Отправлено: Александр Ривилис от 05-02-2014, 21:37:12
вычислил габариты текста и выбрал объекты
Как это сделать? :-[
Как вычислить габариты текста? Метод: Entity.GeometricExtents
Название: Re: Подбор свойства DBText.WidthFactor
Отправлено: Александр Ривилис от 06-02-2014, 14:47:59
Кстати, для проверки пересечения в данном случае можно пользоваться методом Entity.BoundingBoxIntersectWith. Этот метод должен работать быстрее. А вот для уточнения реального пересечения можно использовать Entity.IntersectWith если есть пересечение BoundingBox.
Название: Re: Подбор свойства DBText.WidthFactor
Отправлено: Константин Соков от 12-03-2014, 22:08:04
Может быть немного не в тему. Но вот ситуация: в чертеже есть много однострочного текста. Среди этого множества есть несколько объектов с одинаковым содержимым (DBText.TextString). какой именно текст нужен для редактирования нахожу сейчас, выделяя его секущей рамкой (программно). Это все хорошо работает, если границы рамки находятся в момент редактирования на экране, как только рамка находится за пределами экрана ей (этой рамкой) ничего не удается выбрать. проблема, в том чтобы найти нужный по содержимому текст (их таких несколько, с одинаковым содержимым), который находится в определенном месте.
Название: Re: Подбор свойства DBText.WidthFactor
Отправлено: Дима_ от 12-03-2014, 23:13:00
выделяя его секущей рамкой
в этом корень зла - сек. рамка видит только с проекции экрана (за исключением "выбрать все") - данный "косяк" никак не обойти - либо зумировать экраном, либо использовать другие методы.
Название: Re: Подбор свойства DBText.WidthFactor
Отправлено: Александр Ривилис от 12-03-2014, 23:29:17
данный "косяк"
Это было всегда и видимо всегда и будет...
Название: Re: Подбор свойства DBText.WidthFactor
Отправлено: Дима_ от 12-03-2014, 23:44:19
да, к сожалению.
Название: Re: Подбор свойства DBText.WidthFactor
Отправлено: Владимир Шу от 13-03-2014, 10:52:39
to Константин Соков,
...какой именно текст нужен для редактирования нахожу сейчас, выделяя его секущей рамкой (программно)...
Если вопрос только в том что бы найти эти обекты, то наверное можно их пометить транзитной графикой (http://adn-cis.org/ispolzovanie-tranzitnoj-grafiki.html).
Название: Re: Подбор свойства DBText.WidthFactor
Отправлено: Александр Ривилис от 13-03-2014, 10:54:50
Вообще-то программно можно выделить текст и фильтрами. Для текста это должно быть не сложно.
Название: Re: Подбор свойства DBText.WidthFactor
Отправлено: Константин Соков от 13-03-2014, 13:01:56
фильтрами
Я правильно понял: нужно шерстить базу чертежа, проверяя при этом некоторые условия. например: что объект является однострочным текстом, что его содержимое равно заданному значению, что его расположение (DBText.Position) равно заданному значению или лежит заданой области? или имеется ввиду какой-то конкретный инструмент?
Название: Re: Подбор свойства DBText.WidthFactor
Отправлено: Александр Ривилис от 13-03-2014, 13:06:31
нужно шерстить базу чертежа
Можно и так. А можно использовать SelectionSet с SelectionFilter. И в фильтре использовать фильтрацию по координатом для точки вставки (группа 10).