Сообщество программистов Autodesk в СНГ
ADN Club => AutoCAD .NET API => Тема начата: Константин Соков от 04-02-2014, 21:49:53
-
Здравствуйте. В чертеже много однострочного текста, который постоянно приходится врукопашную редактировать - подбирать его ширину, чтобы он не пересекался с другими объектами (в основном это линии, полилинии и т. д.). Сначала было пробывал устанавливать значение WidthFactor исходя из длины строки (количество символов массива), потом понял что неблагодарное это дело, много нюансов нужно учитывать (высота, стиль, ...). Сейчас пробую сделать следующее - рекурсивный метод, который проверяет пересекается ли текст с другими объектами, если да, то: WidthFactor = WidthFactor - 0.05. Пробывал использовать этот код (http://adn-cis.org/forum/index.php?topic=118.0), но что-то пока не получается. Как можно сделать проще, какие методы использовать?
-
А если так:
- получаем текст, находим объекты, с которыми он пересекается
- вычисляем границы этих объектов, находим размер свободного пространства для текста
- делим длину свободного пространства (за вычетом минимальных расстояний от текста до объектов) на длину текста - получаем значение, на которое нужно умножить текущий коэффициент ширины
- умножаем, задаем тексту новый коэффициент
-
Дмитрий, подскажите как найти объекты с которыми пересекается текст? InterSectWith()?
-
Прочитав первое сообщение, я почему-то подумал, что это уже сделано :)
Я бы, наверное, вычислил габариты текста и выбрал объекты, попадающие в этот габарит секущей рамкой. Метод имеет недостатки, но это самое простое что приходит в голову.
-
вычислил габариты текста и выбрал объекты
Как это сделать? :-[
-
вычислил габариты текста и выбрал объекты
Как это сделать? :-[
Как вычислить габариты текста? Метод: Entity.GeometricExtents
-
Кстати, для проверки пересечения в данном случае можно пользоваться методом Entity.BoundingBoxIntersectWith. Этот метод должен работать быстрее. А вот для уточнения реального пересечения можно использовать Entity.IntersectWith если есть пересечение BoundingBox.
-
Может быть немного не в тему. Но вот ситуация: в чертеже есть много однострочного текста. Среди этого множества есть несколько объектов с одинаковым содержимым (DBText.TextString). какой именно текст нужен для редактирования нахожу сейчас, выделяя его секущей рамкой (программно). Это все хорошо работает, если границы рамки находятся в момент редактирования на экране, как только рамка находится за пределами экрана ей (этой рамкой) ничего не удается выбрать. проблема, в том чтобы найти нужный по содержимому текст (их таких несколько, с одинаковым содержимым), который находится в определенном месте.
-
выделяя его секущей рамкой
в этом корень зла - сек. рамка видит только с проекции экрана (за исключением "выбрать все") - данный "косяк" никак не обойти - либо зумировать экраном, либо использовать другие методы.
-
данный "косяк"
Это было всегда и видимо всегда и будет...
-
да, к сожалению.
-
to Константин Соков,
...какой именно текст нужен для редактирования нахожу сейчас, выделяя его секущей рамкой (программно)...
Если вопрос только в том что бы найти эти обекты, то наверное можно их пометить транзитной графикой (http://adn-cis.org/ispolzovanie-tranzitnoj-grafiki.html).
-
Вообще-то программно можно выделить текст и фильтрами. Для текста это должно быть не сложно.
-
фильтрами
Я правильно понял: нужно шерстить базу чертежа, проверяя при этом некоторые условия. например: что объект является однострочным текстом, что его содержимое равно заданному значению, что его расположение (DBText.Position) равно заданному значению или лежит заданой области? или имеется ввиду какой-то конкретный инструмент?
-
нужно шерстить базу чертежа
Можно и так. А можно использовать SelectionSet с SelectionFilter. И в фильтре использовать фильтрацию по координатом для точки вставки (группа 10).