C++中使用ZcDbDynBlockReferenceProperty::setValue接口
ZRXCMD3(ScaleDynBlock)
{
zds_name ename;
zds_point pt;
if (RTNORM != zcedEntSel(_T("选择动态块.\n"), ename, pt))
{
return;
}
ZcDbObjectId entId;
ZcDbEntity* pEnt = NULL;
zcdbGetObjectId(entId, ename);
ZcDbDynBlockReference dynBlkRef(entId);
if (!dynBlkRef.isDynamicBlock())
{
return;
}
ZcDbDynBlockReferencePropertyArray props;
dynBlkRef.getBlockProperties(props);
for (int i = 0; i < props.length(); i++)
{
ZcDbDynBlockReferenceProperty prop = props[i];
ZcString propName = prop.propertyName();
ZcDbEvalVariant eVal = prop.value();
// 实际应用中可根据属性的类型(type)、单位类型(UnitsType)、属性名(PropertyName)等进行判断
//if (eVal.getType() == ZcDb::DwgDataType::kDwgReal)
if (prop.unitsType() == ZcDbDynBlockReferenceProperty::kDistance)
{
eVal.resval.rreal *= 2;
prop.setValue(eVal);
}
}
}
C#中使用DynamicBlockReferenceProperty.Value属性
[CommandMethod("NetScaleDynBlock")]
static public void NetScaleDynBlock()
{
var db = HostApplicationServices.WorkingDatabase;
var ed = Application.DocumentManager.MdiActiveDocument.Editor;
var per = ed.GetEntity("选择动态块");
if (PromptStatus.OK != per.Status)
{
return;
}
using (var tr = db.TransactionManager.StartTransaction())
{
BlockReference brf = tr.GetObject(per.ObjectId, OpenMode.ForWrite) as BlockReference;
foreach (DynamicBlockReferenceProperty prop in brf.DynamicBlockReferencePropertyCollection)
{
// 实际应用中可根据属性的类型(type)、单位类型(UnitsType)、属性名(PropertyName)等进行判断
//if (prop.PropertyTypeCode == 1)
if(prop.UnitsType == DynamicBlockReferencePropertyUnitsType.Distance)
{
double val = Convert.ToDouble(prop.Value);
prop.Value = val * 2;
}
}
tr.Commit();
}
}














属性的值可能是可选的(列表中的值),所以最好加上下面的判断: ZcDbEvalVariantArray values; prop.getAllowedValues(values); if (values.isEmpty()) { eVal.resval.rreal *= 2; prop.setValue(eVal); }