10/08/2021
Доступ к файлам стандартов оформления AutoCAD (.dws)
У меня появился шанс исследовать эту проблему, когда я наткнулся на запрос на форуме.
Когда пользователь вызывает команду _LAYTRANS, появляется диалоговое окно транслятора слоёв, и пользователю разрешено сопоставление из загруженного рисунка на текущий рисунок.
Слои из загруженного чертежа сопоставляются со слоями в текущем чертеже или могут быть сопоставлены пользователем.
Эта настройка может быть сохранена в качестве файла стандартов (.dws), для будущего использования, когда пользователь получает рисунок от клиента, пользователь может проверить, соответствует ли чертеж указанным файлам стандартов.
Файл стандартов оформления содержит таблицу трансляции слоёв в виде расширенных данных для каждого из слоёв, которые могут быть сопоставлены или транслированы.
Например, в этом файле есть соответствие между слоями A,B,C и 1,2,3. Тогда слои A,B,C файла стандартов (исходного) транслируются в слои 1,2,3 текущего чертежа (назначения)
Чтение dws-файлов точно такое же как и чтение dwg-файлов, только с другим расширением (спасибо Lee за подсказку).
Код - C#: [Выделить]
public static void tstreadDws()
{
// Сохраняем старый чертеж
Database oldDb = HostApplicationServices.WorkingDatabase;
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
// При использовании ReadDwgFile никогда не указывайте True для buildDefaultDwg
// Так же, установите noDocument=True так как этот чертеж не соответствует
// никакому документу AutoCAD Document
using (Database db = new Database(false, true))
{
db.ReadDwgFile("D:\\Temp\\MyStandard.dws", FileOpenMode.OpenForReadAndWriteNoShare, true, "");
// Закрываем ввод, чтобы быть уверенным, что весь dwg-файл прочитан с диска
// Это так же закрывает файл, так что сохранение (SaveAs)
// файла будет возможно с тем же именем
db.CloseInput(true);
string appName = "ACLAYTRANS";
string msg = "ТАБЛИЦА СООТВЕСТВИЯ СЛОЕВ:\n";
// Переключим рабочую базу
HostApplicationServices.WorkingDatabase = db;
using (Transaction t = db.TransactionManager.StartTransaction())
{
LayerTable lt = t.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;
foreach(ObjectId oId in lt)
{
LayerTableRecord ltr = t.GetObject(oId, OpenMode.ForRead) as LayerTableRecord;
ResultBuffer rb = ltr.GetXDataForApplication(appName);
if (rb != null)
{
string layerName = ltr.Name;
// Получаем значения из Xdata
foreach (TypedValue typeVal in rb)
{
if(typeVal.TypeCode == 1000)
{
msg = msg + layerName + ":" + typeVal.Value +"\n";
}
}
}
}
t.Commit();
}
ed.WriteMessage(msg);
// Переключаем обратно рабочую базу
HostApplicationServices.WorkingDatabase = oldDb;
}
}
Результат:
ТАБЛИЦА СООТВЕСТВИЯ СЛОЕВ:
A:1
B:2
C:3
Источник: https://adndevblog.typepad.com/autocad/2017/05/accessing-drawing-standards-file-dws.html
Автор перевода: Александр Ривилис
Опубликовано 10.08.2021