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

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

Необходимо заменить русские буквы в наименовании слоев на английские

Ответ
Поиск в этой теме
Непрочитано 05.12.2018, 23:20 #1
Необходимо заменить русские буквы в наименовании слоев на английские
Станислав Я.
 
Bim/Cad manager
 
Москва
Регистрация: 16.06.2016
Сообщений: 6

Приветствую коллеги,

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

Может кто сталкивался с подобным вопросом? Может есть готовое решение?

По идее, как мне кажется, средствами автокада (и программирования в нем) это несложно решить, что-то типа - выбирается группа файлов, применяется макрос, файлы по очереди открываются им, считываются имена слоев и все русские буквы автозаменяются на, определенные изначально, английские, сохраняется файл, повтор со следующим файлом из списка.
Но моих знаний не хватает на самостоятельное написание, да и нужно это как обычно вчера.
Просмотров: 6099
 
Непрочитано 05.12.2018, 23:57
#2
Кулик Алексей aka kpblc
Moderator

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


Если интересует "только сделать" - то тогда с разделом ошибся. Тебе в Поиск исполнителей тогда надо.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 06.12.2018, 01:03
#3
Станислав Я.

Bim/Cad manager
 
Регистрация: 16.06.2016
Москва
Сообщений: 6


Ну в несколько разделов нельзя постить одно сообщение, да и я надеялся может есть готовая программа, макрос.
Или может кто подскажет алгоритм действий каких, работающий. Типа выгрузить в такой то файл, загрузить туда-то, прогнать там-то и загрузить обратно.
То что нашел - пробовал на основе выгрузки информации о слоях в .las файл (из диспетчера состояния слоев), но это не подходит. Обратно он имена слоев загружает, но не перезаписывает старые (русские), а добавляет новые к старым в список. Да и переименовывать приходится вручную.
Станислав Я. вне форума  
 
Непрочитано 06.12.2018, 08:29
#4
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Станислав Я., если я правильно понимаю, Вы ведь Bim/Cad manager , т.е. то, что Вы просите, Вам нужно по работе, не студенческая задача и не для развлечения, и если Вас озадачили этим вопросом, то вероятно это входит в Ваши должностные обязанности...
Продолжая логическую цепочку, это значит, что Ваше руководство считает, что Вы вполне можете справиться с этой задачей и как Вы правильно пишите, в автокаде нет встроенных средств для решения такой задачи, но можно написать скрипт/программ, которая это сделает и Вы понимая это создали тему в разделе "Программирование"... соответственно можно допустить, что Вы знакомы с некоторыми языками программирования и так как задача не сложная и ее вполне можно решить даже на VBA, то задам собственно основные вопросы:
Что уже сами написали и на каком языке? В чем именно затык? Что не получается?

Хотя, сейчас придет kaMon и компания и выполнит Вашу работу за Вас, а Вы не получите нужные Вам знания и навыки. Печально это все.
Boxa вне форума  
 
Непрочитано 06.12.2018, 10:03
#5
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


усё по ГОСТ'у
trir вне форума  
 
Непрочитано 06.12.2018, 10:16
#6
Сергей812


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


Offtop:
Цитата:
Сообщение от Boxa Посмотреть сообщение
Bim/Cad manager
CAD/BIM Менеджер != CAD/BIM Программист) И неправильная форма вызова палочки-выручалочки -> "koMon")
Сергей812 вне форума  
 
Непрочитано 06.12.2018, 11:24
#7
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


делов то
Код:
[Выделить все]
        public void EditDWG(string path)
        {
            using (Database db = new Database(false, true))
            {
                db.ReadDwgFile(path, FileOpenMode.OpenForReadAndWriteNoShare, false, null);
                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                    LayerTable lTbl = db.LayerTableId.GetObject(OpenMode.ForRead) as LayerTable;
                    foreach (ObjectId iLyr in lTbl)
                    {
                        LayerTableRecord lyr = iLyr.GetObject(OpenMode.ForWrite) as LayerTableRecord;
                        if (lyr.Name != "0") lyr.Name += "_";
                    }
                    tr.Commit();
                }
                db.SaveAs(path, true, DwgVersion.Current, db.SecurityParameters);
            }
        }
trir вне форума  
 
Непрочитано 06.12.2018, 11:29
1 | 1 #8
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


trir, я и писал, что это не сложно... а по поводу кода EditDWG то, "Defpoints" то же переименовываем? Да и транзакцию тут в общем то не обязательно использовать =о)
Сергей812, Рука дрогнула, не то заклинание написал =о)
Boxa вне форума  
 
Непрочитано 06.12.2018, 11:32
1 | 1 #9
Сергей812


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


и как минимум, хотя бы один общий обработчик исключений сделать. И не void, а string - и возвращать текст исключения в случае ошибки.
Сергей812 вне форума  
 
Непрочитано 06.12.2018, 12:02
#10
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


это уже детали, код просто Proof of concept

Цитата:
Да и транзакцию тут в общем то не обязательно использовать =о)
я убрал транзакцию и AutoCAD упал - что я не так делаю?
Код:
[Выделить все]
        public void EditDWG(string path)
        {
            using (Database db = new Database(false, true))
            {
                db.ReadDwgFile(path, FileOpenMode.OpenForReadAndWriteNoShare, false, null);
                LayerTable lTbl = db.LayerTableId.GetObject(OpenMode.ForRead) as LayerTable;
                foreach (ObjectId iLyr in lTbl)
                {
                    LayerTableRecord lyr = iLyr.GetObject(OpenMode.ForWrite) as LayerTableRecord;
                    if (lyr.Name != "0") lyr.Name = Transliteration.CyrillicToLatin(lyr.Name, Language.Russian).Replace("`", "");
                }
                db.SaveAs(path, true, DwgVersion.Current, db.SecurityParameters);
            }
        }

Последний раз редактировалось trir, 06.12.2018 в 12:08.
trir вне форума  
 
Непрочитано 06.12.2018, 12:12
#11
Maksim7enov


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


Добрый день! Сделал только для одного файла. Посмотрите пожалуйста можно ли так делать? В Лиспе все можно сделать намного проще?
Код:
[Выделить все]
 
(vlax-for item (vla-get-layers
		 (vla-get-activedocument (vlax-get-acad-object))
	       ) ;_ _end_of_vla-get-layers
  (progn
    (vl-catch-all-apply
      (function
	(lambda	()
	  (setq name_layer (strcase (vla-get-name item)))
	) ;_ _end_of_lambda
      ) ;_ _end_of_function
    ) ;_ _end_of_vl-catch-all-apply
    (REPEAT (strlen name_layer)
      (cond ((= (wcmatch name_layer "*А*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "A" "А" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*Б*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "B" "Б" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*В*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "V" "В" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*Г*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "G" "Г" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*Д*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "D" "Д" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*Е*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "E" "Е" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*Ж*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "ZH" "Ж" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*З*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "Z" "З" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*И*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "I" "И" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*К*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "K" "К" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*Л*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "L" "Л" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*М*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "M" "М" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*Н*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "N" "Н" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*О*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "O" "О" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*П*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "P" "П" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*Р*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "R" "Р" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*С*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "S" "С" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*Т*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "T" "Т" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*У*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "U" "У" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*Ф*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "F" "Ф" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*Х*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "X" "Х" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*Ц*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "C" "Ц" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*Ч*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "CH" "Ч" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*Ш*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "SH" "Ш" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*Щ*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "W" "Щ" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*Ь*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "Q" "Ь" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*Ъ*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "Q" "Ъ" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*Э*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "EH" "Э" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*Ю*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "YU" "Ю" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*Я*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "YA" "Я" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*Ё*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "YO" "Ё" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    ((= (wcmatch name_layer "*Й*") T)
	     (progn
	       (setq name_layer (VL-STRING-SUBST "J" "Й" name_layer))
	       (vla-put-name item name_layer)
	     ) ;_ _end_of_progn
	    )
	    (t nil)
      ) ;_ _end_of_cond
    ) ;_ _end_of_REPEAT
  ) ;_ _end_of_progn
) ;_ _end_of_vlax-for
Maksim7enov вне форума  
 
Непрочитано 06.12.2018, 12:17
#12
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


Цитата:
Сделал только для одного файла
а как сделать для нескольких?
ты это ручками писал?
trir вне форума  
 
Непрочитано 06.12.2018, 12:24
1 | 1 #13
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


trir, Я б то же упал бы. Ладно using не используете, но тогда не забывайте руками закрывать объекты. И не ObjectId.GetObject(), а ObjectId.Open()
Код:
[Выделить все]
         public static void EditDWG(string path)
        {
            using (Db.Database db = new Db.Database(false, true))
            {
                db.ReadDwgFile(path, Db.FileOpenMode.OpenForReadAndWriteNoShare, false, null);
                using (Db.LayerTable lTbl = db.LayerTableId.Open(Db.OpenMode.ForRead) as Db.LayerTable)
                    foreach (Db.ObjectId iLyr in lTbl)
                    {
                        using(Db.LayerTableRecord lyr = iLyr.Open(Db.OpenMode.ForWrite) as Db.LayerTableRecord)
                        if (lyr.Name != "0") lyr.Name += "_";
                    }
                db.SaveAs(path, true, Db.DwgVersion.Current, db.SecurityParameters);
            }
        }
Boxa вне форума  
 
Непрочитано 06.12.2018, 12:26
#14
Сергей812


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


Цитата:
Сообщение от Maksim7enov Посмотреть сообщение
В Лиспе все можно сделать намного проще?
странный вопрос - а вы на чем написали сейчас?) И чего проще - на каждую букву проверяются все условия подряд по списку. Хотя бы списком с циклом сделали
Сергей812 вне форума  
 
Непрочитано 06.12.2018, 12:40
#15
Maksim7enov


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
странный вопрос - а вы на чем написали сейчас?)
Я учусь, и мне надо понимать где я пишу глупости и как можно сделать это легче)

Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Хотя бы списком с циклом сделали
Не додумался как сделать. Если не сложно можно пример!
Maksim7enov вне форума  
 
Непрочитано 06.12.2018, 13:00
1 | #16
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Здесь подобное обсуждали Rus To Eng
Цитата:
(defun C:R2E ( / *error* Doc)
;;;Rus To Eng
(vl-load-com)
....
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 06.12.2018, 13:19
1 | #17
Сергей812


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


Цитата:
Сообщение от Maksim7enov Посмотреть сообщение
Не додумался как сделать. Если не сложно можно пример!
Простыня условий заменяется на список:
Код:
[Выделить все]
 (setq lTrList '(("а" . "a") ("А" . "A") ("б" . "b") ("Б" . "B") ("в" . "v") ("В" . "V")))
и далее извлекаете соответствующий через
Код:
[Выделить все]
 cdr(assoc %Входной символ% lTrList))
----- добавлено через ~1 мин. -----
список, естественно, создается один раз в начале.

----- добавлено через ~7 мин. -----
Собственно, по ссылке VVA подобное и сделано. В лиспе нет оператора множественного выбора типа case, switch - который после совпадения одного из условий автоматически пропускает все следующие сравнения.
Сергей812 вне форума  
 
Непрочитано 06.12.2018, 13:33
#18
Maksim7enov


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


Спасибо! Буду разбираться.
Maksim7enov вне форума  
 
Непрочитано 06.12.2018, 14:08
#19
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
В лиспе нет оператора множественного выбора типа case, switch - который после совпадения одного из условий автоматически пропускает все следующие сравнения.
Кто сказал? cond делает все это и даже значительно удобнее.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.12.2018, 14:38
#20
Сергей812


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


ну в явном виде нет) И не совсем понимаю, почему проще: ведь cond требует "пар" условие-значение, а assoc напрямую перебирает список пар - пока не встретиться искомый символ. И обе функции возвращают nil - если нет совпадений.
Сергей812 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Необходимо заменить русские буквы в наименовании слоев на английские

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19
Разрешается ли использовать только заглавные буквы на чертеже? Antaresq Организация проектирования и оформление документации 86 22.11.2015 20:57
Необходимо заменить монолитный стаканный фундамент на фундамент из буронабивных свай с ростверком Владимир Иващенко Основания и фундаменты 12 20.12.2012 06:14
Помощь: Необходимо получить из буквы - ее контур Almig AutoCAD 3 02.06.2005 10:56
Преобразование юникода в русские буквы Дмитрий AutoCAD 1 06.06.2004 20:10