Как вставить динамические блоки с атрибутами в AutoCAD через C# без использования AttSyncC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как вставить динамические блоки с атрибутами в AutoCAD через C# без использования AttSync

Сообщение Anonymous »

Я программно вставляю 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как вставить динамические блоки с атрибутами в AutoCAD через C# без использования AttSync
    Anonymous » » в форуме C#
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Чтобы выбрать только свойства объекта AutoCAD Plant 3D и отменить выбор свойств, отличных от AutoCAD
    Anonymous » » в форуме C#
    0 Ответы
    62 Просмотры
    Последнее сообщение Anonymous
  • Чтобы выбрать только свойства объекта AutoCAD Plant 3D и отменить выбор свойств, отличных от AutoCAD
    Anonymous » » в форуме C#
    0 Ответы
    35 Просмотры
    Последнее сообщение Anonymous
  • Как сделать AutoCAD Addon работать во многих версиях AutoCAD
    Anonymous » » в форуме C#
    0 Ответы
    0 Просмотры
    Последнее сообщение Anonymous
  • Перекрывающиеся блоки Autocad сверху и снизу
    Anonymous » » в форуме Python
    0 Ответы
    25 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»