日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AutoCAD.net Transaction实例4 标高

發布時間:2023/12/9 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AutoCAD.net Transaction实例4 标高 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1?Transaction介紹

一般而言數據庫的增刪改查操作統一交給Transaction(事務)處理,AutoCAD也不例外,它將所有對象以圖形數據庫的形式存儲,并將對象的打開和關閉交給唯一的TransactionManager進行管理,因此TransactionManager必須是一個全局對象,且隨AutoCAD啟動而創建,并管理多個被AutoCAD打開的dwg文檔。

?存儲在硬盤的dwg文檔里面的每個對象都要有一個唯一的編號Handle,這樣才被AutoCAD正確索引。而被Transaction Manager從硬盤取出放入內存的對象也會被重新分配一個唯一的編號ObjectId,它本質是一個內存地址,有了這個地址我們在代碼里面就可以訪問到這個對象。

TransactionManager簡化了數據庫的存儲操作,使對象的增刪改查主要涉及4個函數:StartTransaction、GetObject、AddNewlyCreatedDBObject、Commit。其中StartTransaction函數是獲得Transaction對象的唯一入口,當添加新的對象到內存并得到一個與之關聯的ObjectId后,還需要調用AddNewlyCreatedDBObject函數通知TransactionManager,使后續將要被調用的Commit函數將對象存入硬盤,并為該對象分配Handle。

一段簡單的添加對象的代碼如下:

/// <summary> /// 添加表記錄(BlockTable DimStyleTable LayerTable LinetypeTable RegAppTable TextStyleTable UCSTable ViewportTable ViewTable) /// </summary> /// <param name="symbolTableRecord"></param> /// <param name="symbolTableId"></param> /// <returns></returns> private static ObjectId AddSymbolTableRecord(SymbolTableRecord symbolTableRecord, ObjectId symbolTableId) {using (Transaction tr = GetActiveDatabase().TransactionManager.StartTransaction()){SymbolTable st = (SymbolTable)tr.GetObject(symbolTableId, OpenMode.ForRead);if (!st.Has(symbolTableRecord.Name)){st.UpgradeOpen();st.Add(symbolTableRecord);tr.AddNewlyCreatedDBObject(symbolTableRecord, true);tr.Commit();}return st[symbolTableRecord.Name];} }

上面的代碼對于大部分對象的添加都是可用的,但是對于關聯對象不適用,比如AttributeReference(屬性參照),因為每個AttributeReference必須關聯一個BlockReference(塊參照),在增加AttributeReference對象時,需首先打開關聯的BlockReference對象,否則出錯。對AttributeReference添加的代碼如下:

/// <summary> /// 為塊參照添加屬性 /// </summary> /// <param name="objectId"></param> /// <param name="list"></param> public static void AppendAttribute(ObjectId objectId, params AttributeReference[] list) {using (Transaction tr = GetActiveDatabase().TransactionManager.StartTransaction()){BlockReference br = tr.GetObject(objectId, OpenMode.ForWrite) as BlockReference;if (br == null) throw new Exception("AppendAttribute params error");foreach (var item in list){br.AttributeCollection.AppendAttribute(item);tr.AddNewlyCreatedDBObject(item, true);}tr.Commit();} }

2 Transaction實例?

下面展示的實例是建筑制圖里經常要用到的標高符號的繪制,它由三角形、水平線和文字組成,文字的內容為高程或標高,一般等于Y坐標的值。當坐標系或者位置變化后,還需要對它們的文字內容進行更新。

3 主要代碼

主要代碼如下:

//創建標高 [CommandMethod("bat_bg")] public void Sub17() {double offset = 0;if (InputHelper.GetDouble(ref offset, "\n輸入標高符的水平向偏移距離")){//得到屬性塊IDObjectId attributeBlockId = EntityHelper.GetBlockId("BAT_FFF_BG");//沒有則創建屬性塊if (attributeBlockId == ObjectId.Null){AttributeDefinition attributeDefinition = new AttributeDefinition();attributeDefinition.Tag = "BG";attributeDefinition.Height = 2.5;attributeDefinition.WidthFactor = 0.75;attributeDefinition.HorizontalMode = TextHorizontalMode.TextLeft;attributeDefinition.VerticalMode = TextVerticalMode.TextBase;attributeDefinition.Position = new Point3d(2.2, 0.5, 0);attributeDefinition.SetDatabaseDefaults();attributeBlockId = EntityHelper.CreatEmptyBlock("BAT_FFF_BG");EntityHelper.AddEntity2Block(attributeDefinition, attributeBlockId);}//得到塊屬性AttributeDefinition attdef = EntityHelper.GetBlockAttribute(EntityHelper.GetBlockId("BAT_FFF_BG"), "BG");double dimscale = EntityHelper.GetActiveDatabase().Dimscale;var ucs = Application.DocumentManager.MdiActiveDocument.Editor.CurrentUserCoordinateSystem;DrawJigFramework djf = new DrawJigFramework();do{//創建塊參照BlockReference blockReference = new BlockReference(Point3d.Origin, attributeBlockId);//創建屬性參照 AttributeReference attributeReference = new AttributeReference();attributeReference.SetAttributeFromBlock(attdef, blockReference.BlockTransform);attributeReference.TextString = attdef.TextString;attributeReference.Rotation = attdef.Rotation;attributeReference.Position = attdef.Position;attributeReference.AdjustAlignment(EntityHelper.GetActiveDatabase());//創建標高箭頭Polyline polyline = new Polyline();polyline.AddVertexAt(0, Point2d.Origin, 0, 0, 0);polyline.AddVertexAt(0, Point2d.Origin + new Vector2d(-1, Math.Sqrt(3)), 0, 0, 0);polyline.AddVertexAt(0, Point2d.Origin + new Vector2d(1, Math.Sqrt(3)), 0, 0, 0);polyline.AddVertexAt(0, Point2d.Origin, 0, 0, 0);polyline.AddVertexAt(0, Point2d.Origin, 0, 0, 0);//Jigdjf.JigEntity = new List<Entity>() { polyline, blockReference, attributeReference };djf.JigEntity.ForEach(l => l.Move(offset, 0));djf.JigEntity.ForEach(l => l.Scaling(Point2d.Origin, dimscale));djf.JigPhases = new List<Phase>() { new PointPhase("\n輸入標高所在點", false) };djf.JigUpdate = () =>{Point3d pt0 = (Point3d)djf.JigPhases[0].Value;//更新屬性參照文字attributeReference.TextString = pt0.Y.S3();polyline.RemoveVertexAt(0);Point2d pt = new Point2d((offset + 2.2) * dimscale + attributeReference.GetGeometricWidth() * 1.1, 0);polyline.AddVertexAt(0, pt, 0, 0, 0);//坐標變換djf.JigMatrix = ucs * Matrix3d.Displacement(pt0.GetAsVector());//返回真表示需要重繪return true;};djf.JigEnding = () =>{djf.JigEntity.ForEach(l => l.TransformBy(djf.JigMatrix));EntityHelper.AppendAttribute(blockReference.Post2CurrentSpace(), attributeReference);EntityHelper.Post2CurrentSpace(polyline);//返回假表示不用添加實體return false;};} while (djf.Jig2CurrentSpace());} }//更新標高 [CommandMethod("bat_gxbg")] public void Sub18() {ObjectId[] ids = new ObjectId[] { };if (InputHelper.GetEntityIds(ref ids, "\n選擇需要更新的標高", TypeValueHelper.Insert)){var ucs = Application.DocumentManager.MdiActiveDocument.Editor.CurrentUserCoordinateSystem;foreach (BlockReference item1 in ids.Select(l => EntityHelper.GetEntityById(l) as BlockReference).ToList()){foreach (ObjectId item2 in item1.AttributeCollection){AttributeReference attref = EntityHelper.GetEntityById(item2) as AttributeReference;if (attref.Tag == "BG"){EntityHelper.UpdateEntity<AttributeReference>(item2, l =>{l.TextString = item1.Position.TransformBy(ucs.Inverse()).Y.S3();});break;}}}} }

?

總結

以上是生活随笔為你收集整理的AutoCAD.net Transaction实例4 标高的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: av黄色在线播放 | 日本黄色一区二区 | 日韩精品一区二区三区四区五区 | 欧美在线aa | 日本亚洲色图 | 成人午夜网站 | 在线视频久| 在线观看中文字幕一区二区 | 壮汉被书生c到合不拢腿 | 蘑菇视频黄色 | 污网站免费观看 | 亚洲综合视频在线播放 | 另类欧美日韩 | 人妻无码久久一区二区三区免费 | 国产少女免费观看高清 | 成人网在线观看 | 亚洲欧美日韩偷拍 | 无限资源日本好片 | 三上悠亚久久 | 日韩午夜毛片 | 青青草视频在线免费观看 | 在线视频播放大全 | 少妇色综合 | 国产亚洲精品成人无码精品网站 | 女女百合高h喷汁呻吟玩具 www.亚洲一区 | 精品久久久久久久久久岛国gif | 97碰碰碰| 一区二区三区在线免费播放 | 人人插插 | 日本亚洲欧美在线 | 在线观看污视频网站 | 在线观看日本中文字幕 | 亚洲欧美精品 | 中文在线字幕av | 免费裸体视频网站 | 国产精品88 | 欧美一区二区三区在线 | 国产手机在线 | a黄视频| 色中色在线视频 | 日韩美女激情视频 | 国产精品178页 | 国内自拍一区 | 丰满岳妇乱一区二区三区 | 又黄又高潮的视频 | 国产高清免费 | 亚洲精品乱码久久久久久 | 五月天色站 | 精品国产人妻一区二区三区 | 日韩免费看 | 国产欧美一区二区精品性色99 | 日韩高清影视在线观看 | 色综合视频网 | 国产视频日韩 | 久久精品国产亚洲AV黑人 | 四虎网站在线 | 久久久久99精品成人片试看 | 亚洲高潮av| 狠狠撸在线观看 | av成人免费在线 | 青青草原av在线 | 中文字幕一二三 | 国产精品美女久久久久久久 | 青青操视频在线观看 | 日韩二区视频 | 超碰蜜桃| 亚洲一区电影在线观看 | 高清国产一区二区三区 | 视频在线观看视频 | 黄色大片儿 | 日日碰狠狠躁久久躁蜜桃 | 日韩在线网址 | 九九热在线观看 | 欧美嘿咻视频 | 中文字幕日本人妻久久久免费 | www.97ai.com | 日本免费观看视频 | 精品久久一区二区三区 | 最近最新中文字幕 | 日本一区二区三区电影在线观看 | 嫩草视频在线观看 | 久久精品国产网红主播 | 中国女人内谢69xxxx | 欧美日韩亚洲综合 | 少妇的性事hd | 天天综合永久 | 69视频污| 九九热这里都是精品 | 男人操女人的网站 | 国产主播一区二区 | 长篇高h乱肉辣文 | 欧美黄色大片在线观看 | 国产精品老熟女一区二区 | 精品亚洲国产成人av制服丝袜 | 污污视频在线看 | 日韩精品久久久久久久电影99爱 | 国产ts在线| 亚洲av无码日韩精品影片 | 亚洲熟女乱综合一区二区三区 |