@ Калиф, да, без плагина в коде .NET / C ++ / Lisp невозможно извлечь атрибуты блока только скриптом.Я бы порекомендовал .NET.Вам будет легче начать, если вы не знакомы с C ++.
Во-первых, я бы посоветовал вам взглянуть на учебные лаборатории AutoCAD .NET API:
https://www.autodesk.com/developer-network/platform-technologies/autocad
выбрать последнюю версию, если вы установили последнюю версиюверсия AutoCAD.Тем не менее, основной рабочий процесс API одинаков для разных версий.Вы также можете выбрать C ++ (ObjectARX), если хотите.
В приведенных выше руководствах демонстрируется, как работать с блоком.А в блоге ниже рассказывается, как получить атрибуты:
http://through -the-interface.typepad.com / through_the_interface / 2006/09 / getting_autocad.html
Я скопировал здесь для удобства:
using Autodesk.AutoCAD;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
namespace MyApplication
{
public class DumpAttributes
{
[CommandMethod("LISTATT")]
public void ListAttributes()
{
Editor ed =
Application.DocumentManager.MdiActiveDocument.Editor;
Database db =
HostApplicationServices.WorkingDatabase;
Transaction tr =
db.TransactionManager.StartTransaction();
// Start the transaction
try
{
// Build a filter list so that only
// block references are selected
TypedValue[] filList = new TypedValue[1] {
new TypedValue((int)DxfCode.Start, "INSERT")
};
SelectionFilter filter =
new SelectionFilter(filList);
PromptSelectionOptions opts =
new PromptSelectionOptions();
opts.MessageForAdding = "Select block references: ";
PromptSelectionResult res =
ed.GetSelection(opts, filter);
// Do nothing if selection is unsuccessful
if (res.Status != PromptStatus.OK)
return;
SelectionSet selSet = res.Value;
ObjectId[] idArray = selSet.GetObjectIds();
foreach (ObjectId blkId in idArray)
{
BlockReference blkRef =
(BlockReference)tr.GetObject(blkId,
OpenMode.ForRead);
BlockTableRecord btr =
(BlockTableRecord)tr.GetObject(
blkRef.BlockTableRecord,
OpenMode.ForRead
);
ed.WriteMessage(
"\nBlock: " + btr.Name
);
btr.Dispose();
AttributeCollection attCol =
blkRef.AttributeCollection;
foreach (ObjectId attId in attCol)
{
AttributeReference attRef =
(AttributeReference)tr.GetObject(attId,
OpenMode.ForRead);
string str =
("\n Attribute Tag: "
+ attRef.Tag
+ "\n Attribute String: "
+ attRef.TextString
);
ed.WriteMessage(str);
}
}
tr.Commit();
}
catch (Autodesk.AutoCAD.Runtime.Exception ex)
{
ed.WriteMessage(("Exception: " + ex.Message));
}
finally
{
tr.Dispose();
}
}
}
}
У меня есть образец для создания знаков на чертеже.Он охватывает получение атрибутов и изменение атрибутов:
https://forge.autodesk.com/cloud_and_mobile/2016/02/sign-title-block-of-dwg-file-with-autocad-io-view-data-api.html
И у меня также есть пример получения ячеек таблицы чертежа:
https://forge.autodesk.com/blog/get-cell-data-autocad-table-design-automation-api
Надеюсь, это поможет вам создать плагин для ваших требований.