找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1822|回复: 5

[求助] [转]->[求助]为什么属性不能显示出来?

[复制链接]

已领礼包: 3919个

财富等级: 富可敌国

发表于 2014-8-3 08:11:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
各位大神,有如下相同的问题,请问如何解决?
[转]各位专家,以下程序先生成由一个圆和标记为"Height”、"DotMake"的两个属性文字组成的块,然后再选取点插入这个属性块,但是只有圆显示出来,属性文字没有显示出来,请问这是为什么?
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using Autodesk.AutoCAD.ApplicationServices;
  7. using Autodesk.AutoCAD.DatabaseServices;
  8. using Autodesk.AutoCAD.EditorInput;
  9. using Autodesk.AutoCAD.Geometry;
  10. using Autodesk.AutoCAD.Runtime;
  11. using Autodesk.AutoCAD.Colors;
  12. namespace Ctest
  13. {
  14.     public class Class1
  15.     {
  16.         [CommandMethod("test")]
  17.         public void test()
  18.         {
  19.             ObjectId TkId = CreateB2();
  20.             Document acDoc = Application.DocumentManager.MdiActiveDocument;
  21.             PromptPointResult pPtRes;
  22.             PromptPointOptions pPtOpts = new PromptPointOptions("\n请指定块的插入点<按ESC键结束>: ");
  23.             pPtOpts.UseBasePoint = false;
  24.             bool Pdbz = true;
  25.             int i = 1;
  26.             while (Pdbz == true)
  27.             {
  28.                 pPtRes = acDoc.Editor.GetPoint(pPtOpts);
  29.                 Point3d ptCrd = pPtRes.Value;
  30.                 if (pPtRes.Status == PromptStatus.OK)
  31.                 {
  32.                     InsertB2(TkId, i.ToString(), (1000 * i).ToString(), ptCrd);
  33.                     i = i + 1;
  34.                 }
  35.                 else
  36.                 {
  37.                     Pdbz = false;
  38.                 }
  39.             }
  40.         }
  41.         //生成B2"图块
  42.         public ObjectId CreateB2()
  43.         {
  44.             ObjectId newBtrId = new ObjectId();
  45.             Database db = HostApplicationServices.WorkingDatabase;
  46.             Transaction trans = db.TransactionManager.StartTransaction();
  47.             Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  48.             try
  49.             {
  50.                 BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForWrite);
  51.                 if ((bt.Has("B2")))
  52.                 {
  53.                     newBtrId = bt["B2"];
  54.                 }
  55.                 else
  56.                 {
  57.                     Point3d center = new Point3d(0.0, 0.0, 0.0);
  58.                     Circle circle = new Circle(center, Vector3d.ZAxis, 0.5);
  59.                     circle.ColorIndex = 1;
  60.                     AttributeDefinition text1 = new AttributeDefinition(new Point3d(0.5, 0.0, 0.0), "", "Height", "", db.Textstyle);
  61.                     text1.ColorIndex = 1;
  62.                     text1.Height = 1.0;
  63.                     text1.HorizontalMode = TextHorizontalMode.TextLeft;
  64.                     text1.VerticalMode = TextVerticalMode.TextBottom;
  65.                     AttributeDefinition text2 = new AttributeDefinition(new Point3d(0.5, 0.0, 0.0), "", "DotMake", "", db.Textstyle);
  66.                     text2.ColorIndex = 3;
  67.                     text2.Height = 1.0;
  68.                     text2.HorizontalMode = TextHorizontalMode.TextLeft;
  69.                     text2.VerticalMode = TextVerticalMode.TextTop;
  70.                     BlockTableRecord newBtr = new BlockTableRecord();
  71.                     newBtr.Name = "B2";
  72.                     newBtrId = bt.Add(newBtr);
  73.                     trans.AddNewlyCreatedDBObject(newBtr, true);
  74.                     newBtr.AppendEntity(circle);
  75.                     newBtr.AppendEntity(text1);
  76.                     newBtr.AppendEntity(text2);
  77.                     trans.AddNewlyCreatedDBObject(circle, true);
  78.                     trans.AddNewlyCreatedDBObject(text1, true);
  79.                     trans.AddNewlyCreatedDBObject(text2, true);
  80.                 }
  81.                 trans.Commit();
  82.             }
  83.             catch
  84.             {
  85.                 ed.WriteMessage("生成B2图块出错!");
  86.             }
  87.             finally
  88.             {
  89.                 trans.Dispose();
  90.             }
  91.             return newBtrId;
  92.         }
  93.         //插入名为"B2"块参照到模型空间
  94.         public ObjectId InsertB2(ObjectId XBId, string Xstr1, string Xstr2, Point3d pos)
  95.         {
  96.             Database db = HostApplicationServices.WorkingDatabase;
  97.             Transaction trans = db.TransactionManager.StartTransaction();
  98.             try
  99.             {
  100.                 BlockTable bt = (BlockTable)(trans.GetObject(db.BlockTableId, OpenMode.ForWrite));
  101.                 BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  102.                 BlockReference br = new BlockReference(pos, XBId);
  103.                 AttributeReference attRef = new AttributeReference();
  104.                 BlockTableRecord empBtr = (BlockTableRecord)trans.GetObject(bt["B2"], OpenMode.ForRead);
  105.                 foreach (ObjectId id in empBtr)
  106.                 {
  107.                     Entity ent = (Entity)trans.GetObject(id, OpenMode.ForRead, false);
  108.                     if (ent is AttributeDefinition)
  109.                     {
  110.                         AttributeDefinition attDef = ((AttributeDefinition)(ent));
  111.                         attRef.SetPropertiesFrom(attDef);
  112.                         attRef.Position = new Point3d(0.5 + br.Position.X, 0.0 + br.Position.Y, 0.0 + br.Position.Z);
  113.                         if ((string)attRef.Tag == "Height")
  114.                         {
  115.                             attRef.TextString = Xstr1;
  116.                             attRef.HorizontalMode = TextHorizontalMode.TextLeft;
  117.                             attRef.VerticalMode = TextVerticalMode.TextBottom;
  118.                         }
  119.                         else
  120.                         {
  121.                             attRef.TextString = Xstr2;
  122.                             attRef.HorizontalMode = TextHorizontalMode.TextLeft;
  123.                             attRef.VerticalMode = TextVerticalMode.TextTop;
  124.                         }
  125.                     }
  126.                 }
  127.                 btr.AppendEntity(br);
  128.                 br.AttributeCollection.AppendAttribute(attRef);
  129.                 trans.AddNewlyCreatedDBObject(attRef, true);
  130.                 trans.AddNewlyCreatedDBObject(br, true);
  131.                 trans.Commit();
  132.                 return br.ObjectId;
  133.             }
  134.             finally
  135.             {
  136.                 trans.Dispose();
  137.             }
  138.         }
  139.     }
  140. }

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-8-3 08:31:14 | 显示全部楼层
AttributeDefinition 是在 BlockDef (BlockTableRecord)中定义,AttributeRef 需要在 Insert 后进行赋值,即使没有没有属性定义的块,插入后也可以对 Insert 增加 属性,Attrib 的父实体是 BlockReference
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-8-3 10:00:51 | 显示全部楼层
本帖最后由 csharp 于 2014-8-3 10:58 编辑

  1.         //插入名为"B2"块参照到模型空间

  2.         public ObjectId InsertB2(ObjectId XBId, string Xstr1, string Xstr2, Point3d pos)
  3.         {
  4.             Database db = HostApplicationServices.WorkingDatabase;
  5.             Transaction trans = db.TransactionManager.StartTransaction();

  6.             try
  7.             {

  8.                 BlockTable bt = (BlockTable)(trans.GetObject(db.BlockTableId, OpenMode.ForWrite));
  9.                 BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace],
  10.                     OpenMode.ForWrite);

  11.                 //先行将 BlockRef 加入数据库
  12.                 BlockReference br = new BlockReference(pos, XBId);
  13.                 btr.AppendEntity(br);
  14.                 trans.AddNewlyCreatedDBObject(br, true);

  15.                 //属性平移矩阵
  16.                 Matrix3d mat = new Matrix3d((new[] { 1, 0, 0, 0.5, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1 }));
  17.                 Matrix3d pmat = br.BlockTransform.PostMultiplyBy(mat);

  18.                 BlockTableRecord empBtr = (BlockTableRecord)trans.GetObject(bt["B2"], OpenMode.ForRead);
  19.                 foreach (ObjectId id in empBtr)
  20.                 {
  21.                     Entity ent = (Entity)trans.GetObject(id, OpenMode.ForRead, false);
  22.                     AttributeReference attRef = new AttributeReference();
  23.                     if (ent is AttributeDefinition)
  24.                     {
  25.                         AttributeDefinition attDef = ((AttributeDefinition)(ent));
  26.                         attRef.SetPropertiesFrom(attDef);
  27.                         attRef.SetAttributeFromBlock(attDef, pmat);//位置

  28.                         if (attDef.Tag == "Height")
  29.                         {
  30.                             attRef.TextString = Xstr1;
  31.                             attRef.VerticalMode = TextVerticalMode.TextBottom;
  32.                         }
  33.                         else
  34.                         {
  35.                             attRef.TextString = Xstr2;
  36.                             attRef.VerticalMode = TextVerticalMode.TextTop;
  37.                         }

  38.                         attRef.Tag = attDef.Tag;
  39.                         attRef.HorizontalMode = TextHorizontalMode.TextLeft;

  40.                         //对 BlockRef 赋属性并显示
  41.                         br.AttributeCollection.AppendAttribute(attRef);
  42.                         trans.AddNewlyCreatedDBObject(attRef, true);
  43.                     }
  44.                 }
  45.                 trans.Commit();
  46.                 return br.ObjectId;
  47.             }
  48.             finally
  49.             {
  50.                 trans.Dispose();
  51.             }
  52.         }
复制代码

顺序 DataBase -> AppendEntity BlockReference -> BlockReference AppendAttribute -> trans.Commit();
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3919个

财富等级: 富可敌国

 楼主| 发表于 2014-8-3 11:27:38 | 显示全部楼层
谢谢两位的帮助!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3919个

财富等级: 富可敌国

 楼主| 发表于 2014-8-3 11:29:00 | 显示全部楼层
感谢csharp 的帮助和源码,问题已解决!{:soso_e179:}{:soso_e179:}{:soso_e179:}

点评

属性平移矩阵应该这样  详情 回复 发表于 2014-8-3 19:25
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-8-3 19:25:05 | 显示全部楼层
dnbcgrass 发表于 2014-8-3 11:29
感谢csharp 的帮助和源码,问题已解决!

属性平移矩阵应该这样

  1. //属性平移矩阵
  2. Matrix3d pmat = br.BlockTransform .PostMultiplyBy( Matrix3d.Displacement(new Vector3d( 0.5,0,0)));
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-19 00:20 , Processed in 0.412374 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表