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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как программно изменить у MTEXT свойство "динамические столбцы" на "единственный"

Как программно изменить у MTEXT свойство "динамические столбцы" на "единственный"

Ответ
Поиск в этой теме
Непрочитано 03.08.2018, 15:41 #1
Как программно изменить у MTEXT свойство "динамические столбцы" на "единственный"
===AAA===
 
г. Норильск
Регистрация: 15.08.2005
Сообщений: 451

Всем привет!

Задача: имеется программка, в которой выбираются разные
текстовые примитивы (включая МТЕХТы) и чего-то там с ними
делается.

Т.е. имя примитива MTEXT у нас есть.

Теперь, если поменять его содержание, при свойствах этого
МТЕХТа "динамические столбцы" мы можем получить (а можем
и не получить) ситуацию, когда несколько "дурной" примитив
МТЕХТ, состоящий из одной строки в 2-3 слова распадается на
два столбца.

Решение простое - включить ему свойство "1 столбец".

Как?

Нужно буквально несколько строчек кода (vla- ... чего там ? ...)

----- добавлено через ~1 мин. -----
Да, конечно, его можно "взорвать", но нужно сохранить исходный МТЕХТ.
__________________
Счастливо, Алексей!
Просмотров: 1944
 
Непрочитано 03.08.2018, 16:49
#2
Кулик Алексей aka kpblc
Moderator

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


Попробовал через ActiveX - разницы в свойствах нет. Через entget обнаружил разницу по группам 41, 46, 42. Но если смотреть на официальную документацию, то должны быть как минимум еще и группы 75, 76, 78, 79, 48, 49, 50. Но либо я плохо смотрел, либо различий нет.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.08.2018, 16:54
#3
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 451


Но что-то ведь встроенный в Автокад редактор многострочного текста меняет...
Одно движение (кнопка слева-вверху) - готово.
Случайно не метод ArrayRectangular ?
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 03.08.2018, 17:23
#4
Сергей812


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


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Случайно не метод ArrayRectangular ?
в .Net это свойство ColumnType.
А вот в VBA вообще не вижу ничего похоже - забыли вынести?
Сергей812 вне форума  
 
Автор темы   Непрочитано 03.08.2018, 19:30
#5
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 451


Печально...

Я только на классическом Lisp'e (конечно, с использование всяких vla- и vlax- функций)
пишу, ибо не есть программист по профессии. Так что если кто скомпилирует и пришлёт
*.arx с такой функцией - буду признателен.

Иначе придётся считать длину новой текстовой строки для МТЕХТа, потом менять ему
ширину (кажется 41-й код) и только потом вносить новое значение в МТЕХТ.

Неразумно оно как-то... (((
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 03.08.2018, 21:45
2 | #6
Сергей812


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


Набросал по быстрому код .Net, разбирайтесь:

Код:
[Выделить все]
// Microsoft
using System;

// AutoCAD
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;


namespace SetSingleColumnMText
{
    public class CommandClass
    {
        /// <summary>
        /// Установка одного столбца для указанного мультитекста
        /// </summary>
        /// <param name="aArgs">Мультитекст</param>
        /// <returns>nil - установка прошла успешно, "-1" - нет</returns>
        [LispFunction("SetSingleColumnMText")]
        public TypedValue SetSingleColumnMText(ResultBuffer aArgs)
        {
            // Получаем активный документ, его редактор и БД чертежа
            Document lAcadDoc = Application.DocumentManager.MdiActiveDocument;
            Editor lAcadEd = lAcadDoc.Editor;
            Database lAcadDb = lAcadDoc.Database;
            // Если заданы аргументы
            if (aArgs != null)
            {
                try
                {
                    // Получаем массив аргументов
                    Array lArgs = aArgs.AsArray();
                    // Если задан один аргумент
                    if (lArgs.Length == 1)
                    {
                        // Получаем идентификатор мультитекста
                        ObjectId lId = (ObjectId)((TypedValue)lArgs.GetValue(0)).Value;
                        // И в транзакции задаем один столбец 
                        using (Transaction lAcadTran = lAcadDb.TransactionManager.StartTransaction())
                        {
                            MText lMText = (MText)lAcadTran.GetObject(lId, OpenMode.ForWrite);
                            lMText.ColumnType = ColumnType.NoColumns;
                            lAcadTran.Commit();
                        }
                    }
                }
                catch (System.Exception ex)
                {
                    // Что-то пошло не так
                    lAcadEd.WriteMessage("\nПроизошла ошибка: {0}\n", ex.Message);
                    // Возвращаем признак ошибки
                    return new TypedValue((short)LispDataType.Int16, -1);
                }
            }
            // В случае успешной операции возвращаем Nil
            return new TypedValue((short)LispDataType.Nil);
        }
    }
}

запуск
Код:
[Выделить все]
 (SetSingleColumnMText (car (entsel "Выберите мультитекст:")))
Offtop: p.s. я тоже не программист, если что - жизнь заставила вникать во все это)
Сергей812 вне форума  
 
Автор темы   Непрочитано 04.08.2018, 06:46
#7
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 451


Спасибо!

Попробую разобраться...
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Автор темы   Непрочитано 06.08.2018, 18:26
#8
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 451


Спасибо, всё работает!

Правда, 100%-го счастья всё равно не получилось, т.к. (как
выяснилось) имеются МТЕКСТы с разным гм... "логическим
ограничением", что ли.

Т.е. даже когда столбец один, одни из них (при увеличении
в них количества символов) можно расширять, но нельзя,
чтобы они становились многострочными, а другие - наоборот.

Но это уже на обычном Лиспе всё решается, тут много
сложнее, чтобы программа сама определила, с каким
из МТЕКСов она сейчас имеет дело.

Спасибо ещё раз.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как программно изменить у MTEXT свойство "динамические столбцы" на "единственный"

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен лисп, который высчитывает уклон линии ВоваН LISP 53 02.06.2021 10:09
изменить стиль MTEXT Redya AutoCAD 31 20.10.2019 10:44
Как изменить ширину MText атрибута во вставленном блоке ? Roman3R AutoCAD 7 23.09.2011 17:40
Где хранятся данные о координатах отображения вюпорта, и как их программно изменить? Red Nova Программирование 9 03.04.2008 09:24
Как изменить вид маркеров марк. списка в ред. Mtext ac 2006 kp+ AutoCAD 2 12.12.2006 13:13