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

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

Изменить вес слоев внешней ссылки.

Ответ
Поиск в этой теме
Непрочитано 21.01.2013, 17:38 #1
Изменить вес слоев внешней ссылки.
shartal
 
Регистрация: 12.08.2009
Сообщений: 447

Как можно сделать это быстро? В ссылках слоев много, используется 3 разных веса. Диспетчер конфигураций не работает со ссылками. Вес всех слоев нужно уменьшить на 50% или задать для каждого веса другое значение. Использование фильтра по свойствам тоже не особо быстрое занятие.
Просмотров: 4307
 
Непрочитано 21.01.2013, 17:48
#2
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


по внешней ссылке получаешь имя чертежа, в котором нужно править слои, открываешь его Database и проходишся итерацией по содержимому LayerTable, получая каждую запись LayerTableRecord. Для каждой записи получаешь значение назначенной толщины линии (enum LineWeight), делишь его числовое значение на два и для указанного значения подбираешь ближайшее большее (в том же enum). Результат назначаешь слою.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 21.01.2013, 18:18
#3
shartal


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


Случай не единичный, ссылки используются постоянно, всю эту процедуру придется делать в каждом файле?
shartal вне форума  
 
Непрочитано 21.01.2013, 18:21
#4
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


можешь выполнить в пакетном режиме, обработав все файлы каталога или подшивки - никто же не запрещает.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 21.01.2013, 18:49
#5
shartal


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


К своему прискорбию, я не понял ничего кроме того , что без С++ здесь не обойтись.
shartal вне форума  
 
Непрочитано 21.01.2013, 18:58
#6
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


обойтись. ты же не указал язык программирования - значит полиглот, вот я тебе и ответил для .net.

UPD. Код, который делает то, о чём ты спрашивал (во всех подключенных к текущему чертежу файлах внешних ссылок все толщины линий, назначенные слоям, уменьшает вдвое):
Код:
[Выделить все]
// C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using cad = Autodesk.AutoCAD.ApplicationServices.Application;
using AppSrv = Autodesk.AutoCAD.ApplicationServices;
using DbSrv = Autodesk.AutoCAD.DatabaseServices;
using EdInp = Autodesk.AutoCAD.EditorInput;
using Geom = Autodesk.AutoCAD.Geometry;
using Rtm = Autodesk.AutoCAD.Runtime;

[assembly: Rtm.CommandClass(typeof(AndreyBushman.CAD.Sample.SampleClass))]

namespace AndreyBushman.CAD.Sample {

    public sealed class SampleClass {

        [Rtm.CommandMethod("divideXRefLayersWeight")]
        public void divideXRefLayersWeight() {
            AppSrv.Document doc = cad.DocumentManager.MdiActiveDocument;
            EdInp.Editor ed = doc.Editor;
            DbSrv.Database db = doc.Database;

            Dictionary<DbSrv.LineWeight, DbSrv.LineWeight> dict = new Dictionary<DbSrv.LineWeight, DbSrv.LineWeight>();
            Int32[] values = Enum.GetValues(typeof(DbSrv.LineWeight)).Cast<Int32>().OrderByDescending(n => n).ToArray();
            foreach (Int32 item in values) {
                dict.Add((DbSrv.LineWeight) item, (DbSrv.LineWeight) values.First(n => n <= (item / 2)));
            }

            using (DbSrv.Transaction tr = db.TransactionManager.StartTransaction()) {
                DbSrv.BlockTable bt = tr.GetObject(db.BlockTableId, DbSrv.OpenMode.ForRead) as DbSrv.BlockTable;
                foreach (DbSrv.ObjectId id in bt) {
                    DbSrv.BlockTableRecord btr = tr.GetObject(id, DbSrv.OpenMode.ForRead) as DbSrv.BlockTableRecord;
                    if (btr.IsFromExternalReference) {
                        try {
                            using (DbSrv.Database dbRef = new DbSrv.Database()) {
                                dbRef.ReadDwgFile(btr.PathName, FileShare.ReadWrite, true, null);
                                using (DbSrv.Transaction trRef = dbRef.TransactionManager.StartTransaction()) {
                                    DbSrv.LayerTable lt = trRef.GetObject(dbRef.LayerTableId, DbSrv.OpenMode.ForRead) as DbSrv.LayerTable;
                                    foreach (DbSrv.ObjectId layerId in lt) {
                                        DbSrv.LayerTableRecord layer = trRef.GetObject(layerId, DbSrv.OpenMode.ForWrite) as DbSrv.LayerTableRecord;
                                        layer.LineWeight = dict[layer.LineWeight];
                                    }
                                    trRef.Commit();
                                }
                                dbRef.SaveAs(btr.PathName, DbSrv.DwgVersion.Current);
                            }
                        }
                        catch (Exception ex) {
                            ed.WriteMessage("Exception: ", ex.Message);
                        }
                    }
                }
                tr.Commit();
            }
        }
    }
}
Проверял на AutoCAD 2009 SP3 x64 - всё отработало без проблем.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 21.01.2013 в 19:31.
hwd вне форума  
 
Автор темы   Непрочитано 22.01.2013, 10:59
#7
shartal


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


Произошло роковое недопонимание. Вес меняется в самом файле, который вставлен внешней ссылкой (при условии, что он закрыт), а нужно во вхождении внешней ссылки.
shartal вне форума  
 
Непрочитано 22.01.2013, 11:12
#8
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от shartal Посмотреть сообщение
Произошло роковое недопонимание. Вес меняется в самом файле, который вставлен внешней ссылкой (при условии, что он закрыт), а нужно во вхождении внешней ссылки.
Значит я тебя не правильно понял, решив, что тебе нужно уменьшить вдвое толщины слоёв именно в чертежах, подключенных в качестве внешней ссылки.

UPD

Тогда программный код будет ещё проще:

Код:
[Выделить все]
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using cad = Autodesk.AutoCAD.ApplicationServices.Application;
using AppSrv = Autodesk.AutoCAD.ApplicationServices;
using DbSrv = Autodesk.AutoCAD.DatabaseServices;
using EdInp = Autodesk.AutoCAD.EditorInput;
using Geom = Autodesk.AutoCAD.Geometry;
using Rtm = Autodesk.AutoCAD.Runtime;

[assembly: Rtm.CommandClass(typeof(AndreyBushman.CAD.Sample.SampleClass))]

namespace AndreyBushman.CAD.Sample {

    public sealed class SampleClass {

        [Rtm.CommandMethod("devideXRefLayersWeight2")]
        public void devideXRefLayersWeight2() {
            AppSrv.Document doc = cad.DocumentManager.MdiActiveDocument;
            EdInp.Editor ed = doc.Editor;
            DbSrv.Database db = doc.Database;

            cad.SetSystemVariable("VISRETAIN", 1);

            Dictionary<DbSrv.LineWeight, DbSrv.LineWeight> dict = new Dictionary<DbSrv.LineWeight, DbSrv.LineWeight>();
            Int32[] values = Enum.GetValues(typeof(DbSrv.LineWeight)).Cast<Int32>().OrderByDescending(n => n).ToArray();
            foreach (Int32 item in values) {
                dict.Add((DbSrv.LineWeight) item, (DbSrv.LineWeight) values.Last(n => n >= (item / 2)));
            }

            using (DbSrv.Transaction tr = db.TransactionManager.StartTransaction()) {
                DbSrv.LayerTable lt = tr.GetObject(db.LayerTableId, DbSrv.OpenMode.ForRead) as DbSrv.LayerTable;
                foreach (DbSrv.ObjectId layerId in lt) {
                    DbSrv.LayerTableRecord layer = tr.GetObject(layerId, DbSrv.OpenMode.ForWrite) as DbSrv.LayerTableRecord;
                    if (layer.Name.Contains('|'))
                        layer.LineWeight = layer.LineWeight == DbSrv.LineWeight.LineWeight005 ? 
                            DbSrv.LineWeight.LineWeight000 : dict[layer.LineWeight];
                }
                tr.Commit();
            }
        }
    }
}
UPD
Обновил код: оптимизировал выбор подходящей толщины линии. Прошлый вариант некорректно обрабатывал случай, когда толщина линии была 0,09 - в этом случае, при делении пополам назначалась новая толщина, равная нулю, а правильней было бы назначать 0,05.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 22.01.2013 в 11:42.
hwd вне форума  
 
Автор темы   Непрочитано 22.01.2013, 12:07
#9
shartal


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


Отлично работает. Спасибо!
shartal вне форума  
 
Непрочитано 22.01.2013, 12:16
#10
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от shartal Посмотреть сообщение
Отлично работает. Спасибо!
Ты выше спрашивал:
Цитата:
Случай не единичный, ссылки используются постоянно, всю эту процедуру придется делать в каждом файле?
Если тема пакетной обработки чертежей всё ещё интересна, то можешь глянуть это.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Изменить вес слоев внешней ссылки.

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли заблокировать перемещение внешней ссылки на чертеже? PSG AutoCAD 10 26.09.2013 10:09
VBA. Программная вставка внешней ссылки. Ошибка в A2012.. AlexV Программирование 29 04.09.2012 13:29
перестал меняться вес линии в диспетчере свойств слоев (неизменно остается "по умолчанию") ИриSkа AutoCAD 9 06.08.2011 16:58
Замена веса линий объектов v_alex Программирование 9 10.03.2011 13:20
Возможно ли изменить в одно действие цвет, тип и вес линии? Pavel Samofalov AutoCAD 10 20.06.2008 02:31