现状地类有林地,159255127有林地农村居民点,255204204农村居民点望天田,255255110望天田机耕道,255180178机耕道旱地,255255183旱地果园,255223127果园河流水面,171255255河流水面荒草地,210255180荒草地坑塘水面,171255255坑塘水面裸岩石砾地,192192192裸岩石砾地祼岩地,255255255祼岩地农村宅基地,255204204农村宅基地特殊用地,255132132特殊用地沟渠,171255255沟渠工矿用地,255180178工矿用地
第一行:"现状地类" 为Mapinfo中的字段名 以下行为具体配置,如第一行 有林地,159255127有林地 第一个"有林地"为字段里的值,后跟的9位数据为RGB颜色,后面的"有林地"是图层名,图层不存在会自动创建 配置文件名为: d:\xdxah.ini 在程序中此路径和名称固定/* 根据MAPINFO导出块属性和配置文件填充图斑 * 此程序需一配置文件 * 作者:王晓东 * QQ:10516321 Email:xiaook@gmail.com * http://goat.cublog.cn */using System.Collections.Generic;using System.IO;using System.Text;using Autodesk.AutoCAD.ApplicationServices;using Autodesk.AutoCAD.DatabaseServices;using Autodesk.AutoCAD.EditorInput;using Autodesk.AutoCAD.Runtime;/*Copyright © 王晓东 2010AutoCAD version:AutoCAD 2006Description: To use HatchByBlockAttribute.dll:1. Start AutoCAD and open a new drawing.2. Type netload and select HatchByBlockAttribute.dll.3. Execute the xah command.*/namespace HatchByBlockAttribute{ /// <summary> /// Summary for Class1. /// </summary> public class Class1 { Document acDoc = Application.DocumentManager.MdiActiveDocument; Editor acDocEd = Application.DocumentManager.MdiActiveDocument.Editor; Database acCurDb =Application.DocumentManager.MdiActiveDocument.Database; [CommandMethod("xah")] public void xah() { acDocEd.WriteMessage(@"\n 根据MAPINFO导出块属性和配置文件填充图斑 \n此程序需一配置文件 \n作者:王晓东 \nQQ:10516321 Email:xiaook@gmail.com"); //读取配置文件 StreamReader configfs = new StreamReader(@"d:\xdxah.ini",Encoding.Default); Dictionary<string, string> confDict = new Dictionary<string,string>(); string str = configfs.ReadLine(); //提取首行字段名 string keyField = str; str = configfs.ReadLine(); while (str != null) { string[] strarr = str.Split(','); confDict.Add(strarr[0], strarr[1]); str = configfs.ReadLine(); } //选择所有块对象 ObjectIdCollection acObjIdColl = new ObjectIdCollection(); PromptSelectionResult acPtRes = acDocEd.SelectAll(); if (acPtRes.Status == PromptStatus.OK) { SelectionSet ss = acPtRes.Value; acObjIdColl = new ObjectIdCollection(ss.GetObjectIds()); } //事务 using (Transaction acTrans =acCurDb.TransactionManager.StartTransaction()) { ObjectIdCollection objIdCol = new ObjectIdCollection(); BlockTable acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,OpenMode.ForRead) as BlockTable; BlockTableRecord acBlkTblRec =acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) asBlockTableRecord; LayerTable acLyrTbl; acLyrTbl = acTrans.GetObject(acCurDb.LayerTableId,OpenMode.ForRead) as LayerTable; //仅提取所有块参照 ObjectIdCollection objColTmp = new ObjectIdCollection(); for (int i = 0; i < acObjIdColl.Count; i++) { DBObject dbObject = acTrans.GetObject(acObjIdColl[i],OpenMode.ForRead); if (dbObject is BlockReference) { objColTmp.Add(acObjIdColl[i]); } } acObjIdColl = objColTmp; for (int j = 0; j < acObjIdColl.Count; j++) //遍历对象 { BlockReference bkRef =(BlockReference)acTrans.GetObject(acObjIdColl[j], OpenMode.ForRead); AttributeCollection attCol = bkRef.AttributeCollection; string sHatchColor = ""; Hatch acHatch = new Hatch(); acHatch.SetDatabaseDefaults(); for (int k = 0; k < attCol.Count; k++) //遍历属性 { AttributeReference attRef =(AttributeReference)acTrans.GetObject(attCol[k], OpenMode.ForRead, false, true); if (attRef.Tag == keyField) { for (int i = 0; i < confDict.Count; i++) //编历配置文件项 { if (confDict.ContainsKey(attRef.TextString)) //确定字典内是否包含此地类主键 { sHatchColor = confDict[attRef.TextString]; } } } } //包含此地类主键,填充此块 DBObjectCollection bkDBCol = new DBObjectCollection(); bkRef.Explode(bkDBCol); //填充前将此块分解并提取Polyline对象 for (int kk = 0; kk < bkDBCol.Count; kk++) { if (bkDBCol[kk] is Polyline) { Polyline pl = (Polyline)bkDBCol[kk]; if (pl.Closed) //只填充闭合多线段 { ObjectIdCollection bkIDCol = newObjectIdCollection(); //要填充对象的Collection acBlkTblRec.AppendEntity((Entity)bkDBCol[kk]); acTrans.AddNewlyCreatedDBObject(bkDBCol[kk],true); bkIDCol.Add(bkDBCol[kk].ObjectId); acHatch.AppendLoop((int)HatchLoopTypes.Outermost,bkIDCol); } } } //填充 if (sHatchColor != "") { byte R = byte.Parse(sHatchColor.Substring(0, 3)); byte G = byte.Parse(sHatchColor.Substring(3, 3)); byte B = byte.Parse(sHatchColor.Substring(6, 3)); string layer = sHatchColor.Substring(9); if (acLyrTbl.Has(layer) == false) { LayerTableRecord acLyrTblRec = newLayerTableRecord(); // Assign the layer the ACI color 1 and a name acLyrTblRec.Color =Autodesk.AutoCAD.Colors.Color.FromRgb(R, G, B); acLyrTblRec.Name = layer; // Upgrade the Layer table for write acLyrTbl.UpgradeOpen(); // Append the new layer to the Layer table and the transaction acLyrTbl.Add(acLyrTblRec); acTrans.AddNewlyCreatedDBObject(acLyrTblRec, true); } acHatch.Layer = layer; acBlkTblRec.AppendEntity(acHatch); acTrans.AddNewlyCreatedDBObject(acHatch, true); acHatch.SetHatchPattern(HatchPatternType.PreDefined,"SOLID"); //acHatch.ColorIndex = int.Parse(sHatchColor); acHatch.Color = Autodesk.AutoCAD.Colors.Color.FromRgb(R,G, B); acHatch.Associative = false; acHatch.EvaluateHatch(true); } } 提示清理边界 //PromptKeywordOptions pKeyOpts = new PromptKeywordOptions(""); //pKeyOpts.Message = "\n清理对象仅留图案填充[No/Yes]"; //pKeyOpts.Keywords.Add("Y"); //pKeyOpts.Keywords.Add("N"); //pKeyOpts.Keywords.Default = "N"; //pKeyOpts.AllowNone = true; //PromptResult pKeyRes = acDoc.Editor.GetKeywords(pKeyOpts); //if (pKeyRes.StringResult == "Y") //{ // //选择所有块对象 // TypedValue[] tv = new TypedValue[1]; // //tv.SetValue(new TypedValue((int)DxfCode.Operator, "<not"), 0); // tv.SetValue(new TypedValue((int)DxfCode.Start, "HATCH"), 0); // //tv.SetValue(new TypedValue((int)DxfCode.Operator, ">not"), 2); // SelectionFilter sf = new SelectionFilter(tv); // ObjectIdCollection acHatchColl = new ObjectIdCollection(); // PromptSelectionResult acPtRes1 = acDocEd.SelectAll(sf); // ObjectIdCollection acObjForDelColl = new ObjectIdCollection(); // PromptSelectionResult acPtRes2 = acDocEd.SelectAll(); // if ((acPtRes1.Status == PromptStatus.OK) && (acPtRes2.Status == PromptStatus.OK)) // { // SelectionSet ss = acPtRes1.Value; // acHatchColl = new ObjectIdCollection(ss.GetObjectIds()); // foreach (ObjectId a in acHatchColl) // { // acObjForDelColl.Remove(a); // } // for (int i = 0; i < acObjForDelColl.Count; i++) // { // DBObject dbobj = acObjForDelColl[i].GetObject(OpenMode.ForRead); // dbobj.Erase(); // } // } //} acTrans.Commit(); } } }}
转载于:https://www.cnblogs.com/chinaHunk/archive/2012/09/24/2700868.html
相关资源:JAVA上百实例源码以及开源项目