Я программно вставляю 1000+ динамических блоков одного и того же типа в AutoCAD, используя C#.
Каждый блок имеет несколько атрибутов и динамические свойства (например, масштаб, вращение, пользовательские значения). < /p>
Проценок вставки работает довольно эффективно - около 15 блоков в секунду - до того, как я не использую attsync < /p>. Запуск attsync (через командный вызов) после того, как вставки вызывает замедление :
Это добавляет от 7 до 10 минут к общему времени выполнения. Правильно, но это становится серьезным узким местом. < /p>
Есть ли способ избежать использования attsync < /code> при программном вставке динамических блоков?public object[,] DibujarDB(string blkName, string[] propsName, object[,] propsValue, ActualizadorFormulario actualizador)
{
var doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
var db = doc.Database;
var ed = doc.Editor;
using (var trans = db.TransactionManager.StartTransaction())
{
try
{
var bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
if (!bt.Has(blkName))
{
ed.WriteMessage($"\nEl bloque '{blkName}' no existe.");
return null;
}
var btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
var lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForRead);
int rows = propsValue.GetLength(0);
int insertedCount = 0;
string miEstado;
var blkId = bt[blkName];
var propIndices = propsName
.Select((name, index) => new { name, index })
.ToDictionary(p => p.name, p => p.index);
int idxDibujar = propIndices["DIBUJAR"];
int idxHandler = propIndices["HANDLER"];
int idxCX = propIndices["CX"];
int idxCY = propIndices["CY"];
int idxCZ = propIndices["CZ"];
int idxANG = propIndices["ANG"];
int idxCAPA = propIndices["CAPA"];
int idxESCX = propIndices["ESCX"];
int idxESCY = propIndices["ESCY"];
int idxESCZ = propIndices["ESCZ"];
RevisionCapas(trans, lt, idxCAPA, propsValue);
string[] dynPropNames = propsName.Skip(11).ToArray();
for (int i = 0; i < rows; i++)
{
var dibujarVal = propsValue[i, idxDibujar]?.ToString();
if (!string.Equals(dibujarVal, "SI", StringComparison.OrdinalIgnoreCase) &&
!string.Equals(dibujarVal, "TRUE", StringComparison.OrdinalIgnoreCase))
{
continue;
}
if (!double.TryParse(propsValue[i, idxCX]?.ToString(), out double cx) ||
!double.TryParse(propsValue[i, idxCY]?.ToString(), out double cy) ||
!double.TryParse(propsValue[i, idxCZ]?.ToString(), out double cz) ||
!double.TryParse(propsValue[i, idxANG]?.ToString(), out double ang) ||
!double.TryParse(propsValue[i, idxESCX]?.ToString(), out double escX) ||
!double.TryParse(propsValue[i, idxESCY]?.ToString(), out double escY) ||
!double.TryParse(propsValue[i, idxESCZ]?.ToString(), out double escZ))
{
ed.WriteMessage($"\nError: Datos inválidos en la fila {i}");
continue;
}
string capa = propsValue[i, idxCAPA]?.ToString() ?? "0";
var blkRef = new BlockReference(new Point3d(cx, cy, cz), blkId)
{
Rotation = ang,
ScaleFactors = new Scale3d(escX, escY, escZ),
Layer = capa
};
btr.AppendEntity(blkRef);
trans.AddNewlyCreatedDBObject(blkRef, true);
propsValue[i, idxHandler] = blkRef.Handle.ToString();
foreach (var propName in dynPropNames)
{
DynamicBlockReferenceProperty prop = blkRef.DynamicBlockReferencePropertyCollection
.Cast()
.FirstOrDefault(p => p.PropertyName == propName);
if (prop != null)
{
var valStr = propsValue[i, propIndices[propName]]?.ToString();
if (valStr != null && prop.Value.ToString() != valStr)
{
try
{
prop.Value = Convert.ChangeType(valStr, prop.Value.GetType());
}
catch
{
ed.WriteMessage($"\nAdvertencia: No se pudo asignar '{valStr}' a la propiedad '{propName}' en fila {i}");
}
}
}
}
insertedCount++;
actualizador.ActualizarProgresoProceso();
}
trans.Commit();
miEstado = "Toca sincronizar el bloque y eso demora, pa'.";
actualizador.ActualizarEstado(miEstado);
ed.Command("._ATTSYNC", "_N", blkName);
miEstado = "Mucho atributo, llave. Mucho hijueputa atributo.";
actualizador.ActualizarEstado(miEstado);
return propsValue;
}
catch (System.Exception ex)
{
ed.WriteMessage($"\nError: {ex.Message}");
}
return null;
}
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... thout-usin
Как вставить динамические блоки с атрибутами в AutoCAD через C# без использования AttSync ⇐ C#
Место общения программистов C#
1749946957
Anonymous
Я программно вставляю 1000+ динамических блоков одного и того же типа в AutoCAD, используя C#.
Каждый блок имеет несколько атрибутов и динамические свойства (например, масштаб, вращение, пользовательские значения). < /p>
Проценок вставки работает довольно эффективно - около 15 блоков в секунду - до того, как я не использую attsync < /p>. Запуск attsync (через командный вызов) после того, как вставки вызывает [b] замедление [/b]:
Это добавляет от 7 до 10 минут к общему времени выполнения. Правильно, но это становится серьезным узким местом. < /p>
Есть ли способ избежать использования attsync < /code> при программном вставке динамических блоков?public object[,] DibujarDB(string blkName, string[] propsName, object[,] propsValue, ActualizadorFormulario actualizador)
{
var doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
var db = doc.Database;
var ed = doc.Editor;
using (var trans = db.TransactionManager.StartTransaction())
{
try
{
var bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
if (!bt.Has(blkName))
{
ed.WriteMessage($"\nEl bloque '{blkName}' no existe.");
return null;
}
var btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
var lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForRead);
int rows = propsValue.GetLength(0);
int insertedCount = 0;
string miEstado;
var blkId = bt[blkName];
var propIndices = propsName
.Select((name, index) => new { name, index })
.ToDictionary(p => p.name, p => p.index);
int idxDibujar = propIndices["DIBUJAR"];
int idxHandler = propIndices["HANDLER"];
int idxCX = propIndices["CX"];
int idxCY = propIndices["CY"];
int idxCZ = propIndices["CZ"];
int idxANG = propIndices["ANG"];
int idxCAPA = propIndices["CAPA"];
int idxESCX = propIndices["ESCX"];
int idxESCY = propIndices["ESCY"];
int idxESCZ = propIndices["ESCZ"];
RevisionCapas(trans, lt, idxCAPA, propsValue);
string[] dynPropNames = propsName.Skip(11).ToArray();
for (int i = 0; i < rows; i++)
{
var dibujarVal = propsValue[i, idxDibujar]?.ToString();
if (!string.Equals(dibujarVal, "SI", StringComparison.OrdinalIgnoreCase) &&
!string.Equals(dibujarVal, "TRUE", StringComparison.OrdinalIgnoreCase))
{
continue;
}
if (!double.TryParse(propsValue[i, idxCX]?.ToString(), out double cx) ||
!double.TryParse(propsValue[i, idxCY]?.ToString(), out double cy) ||
!double.TryParse(propsValue[i, idxCZ]?.ToString(), out double cz) ||
!double.TryParse(propsValue[i, idxANG]?.ToString(), out double ang) ||
!double.TryParse(propsValue[i, idxESCX]?.ToString(), out double escX) ||
!double.TryParse(propsValue[i, idxESCY]?.ToString(), out double escY) ||
!double.TryParse(propsValue[i, idxESCZ]?.ToString(), out double escZ))
{
ed.WriteMessage($"\nError: Datos inválidos en la fila {i}");
continue;
}
string capa = propsValue[i, idxCAPA]?.ToString() ?? "0";
var blkRef = new BlockReference(new Point3d(cx, cy, cz), blkId)
{
Rotation = ang,
ScaleFactors = new Scale3d(escX, escY, escZ),
Layer = capa
};
btr.AppendEntity(blkRef);
trans.AddNewlyCreatedDBObject(blkRef, true);
propsValue[i, idxHandler] = blkRef.Handle.ToString();
foreach (var propName in dynPropNames)
{
DynamicBlockReferenceProperty prop = blkRef.DynamicBlockReferencePropertyCollection
.Cast()
.FirstOrDefault(p => p.PropertyName == propName);
if (prop != null)
{
var valStr = propsValue[i, propIndices[propName]]?.ToString();
if (valStr != null && prop.Value.ToString() != valStr)
{
try
{
prop.Value = Convert.ChangeType(valStr, prop.Value.GetType());
}
catch
{
ed.WriteMessage($"\nAdvertencia: No se pudo asignar '{valStr}' a la propiedad '{propName}' en fila {i}");
}
}
}
}
insertedCount++;
actualizador.ActualizarProgresoProceso();
}
trans.Commit();
miEstado = "Toca sincronizar el bloque y eso demora, pa'.";
actualizador.ActualizarEstado(miEstado);
ed.Command("._ATTSYNC", "_N", blkName);
miEstado = "Mucho atributo, llave. Mucho hijueputa atributo.";
actualizador.ActualizarEstado(miEstado);
return propsValue;
}
catch (System.Exception ex)
{
ed.WriteMessage($"\nError: {ex.Message}");
}
return null;
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79666230/how-to-insert-dynamic-blocks-with-attributes-in-autocad-via-c-sharp-without-usin[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия