检查图层,使其最新。我的代码有什么问题?
在下面发布的代码中,我创建了一个子例程,我正在检查我的WALLS层是否存在。如果不存在,则创建它。如果是,我解冻、解锁并打开它。最后,我将其设为当前层。我遇到的问题是其他人的代码,如果它在我的代码运行后立即运行,则会崩溃并出现eInvalidLayer错误。我想确保我的代码是可靠的,是否可以查看是否有人发现我正在做的事情有任何问题。小心,我仍然认为自己是n00b所以放轻松。。私有子CheckWALLSLayer()。
调暗myTransMan作为DatabaseServices.TransactionManager。
将myDwg调暗为文档。
将myLT调暗为LayerTable。
将myLTR调暗为LayerTableRecords。
尝试。
我的Dwg=Application.DocumentManager.MdiActiveDocument。
我的TransMan=myDwg.TransactionManager。
使用myTrans作为DatabaseServices.Transaction=myTransMan.StartTransaction。
myLT=myDwg.Database.LayerTableId.GetObject(OpenMode.ForRead)。
将myWALLS调暗为字符串="WALLS"。
。
'在开始之前检查层。
如果myLT.Has(myWALLS)=False那么。
myLTR=新图层表记录。
myLTR.Name=myWALLS。
myLTR.Color=Autodesk.AutoCAD.Colors.Color.FromColorIndex(ColorMethod.ByAci,6)'MAGENTA。
myLT.UpgradeOpen。
myLT.Add(myLTR)。
myTrans.AddNewlyCreatedDBObject(myLTR,True)。
其他。
myLTR=myTransMan.GetObject(myLT(myWALLS),OpenMode.ForWrite)。
与myLTR。
如果,IsOff然后,Isoff=False。
如果,IsFrozen然后,IsFrozen=False。
如果,IsLocked然后,IsLocked=False。
以结尾。
结束如果。
。
'打开可分层写入。
myTrans.Commit。
结束使用。
。
'确保墙壁层为当前。
ApplicationServices.Application.SetSystemVariable(“CLAYER”、“WALLS”)。
。
抓住前Autodesk.AutoCAD.Runtime.Exception。
MsgBox("WALLS层设置 - " & 错误Err.ToString)。
最后。
结束尝试。
结束子。
提前感谢,G. A. Blackburn编辑:kdub->代码格式化代码=vbnet。
**** Hidden Message *****
立即澄清?
我看不到任何会导致错误的东西。
关于您的代码。
我个人会制作一个通用例程并将参数传递给它,即:AssertMyLayers(layerName, layerColor, layerLineType)
...
您不需要myTransMan...您可以从事务中执行所有操作。
您创建一个字符串变量myWALLS来保存layerName,但您使用固定字符串来设置SystemVariable。
如果您想要层ON和UNFROZEN和UNLOCKED只需这样设置它们,则无需测试当前属性。
您可以使用
db.Clayer=myLT;
代替Set SystemVariable调用。
考虑
kdub 你的初始myLT定义应该是OpenMode。ForWrite?如果图层不存在,尽管它已被打开进行读取,您仍可以将其添加到图层表中。不知道UpgradeOpen是否会取代它。
除此之外,您可能还应该在If语句之后处置myLT实例。 也许像这样的东西会适合你,从C#转换应该不是问题 /= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 。
。
public void testlayer 01()。
{。
ObjectId layer id 6 = create layer(db," WALLS ",6);。
。
ObjectId layer id 5 = create layer(db," DOORS ",5);。
。
///假设稍后将使用layerID:如果不是无关紧要,也许可以创建一个属性访问器。。
}。
。
公共静态ObjectId CreateLayer(数据库db,字符串layerName,短颜色)。
{。
ObjectId layerId。
使用(事务tr = db,transaction manager . start transaction())。
{。
var lt = (LayerTable)tr,GetObject(db,LayerTableId,OpenMode。for write);。
//检查图层是否存在...。
if (lt.Has(layerName))。
{。
var ltr = (LayerTableRecord)tr,GetObject(lt,OpenMode。for write);。
ltr,IsOff = false。
ltr,IsFrozen = false。
ltr,IsLocked = false。
layerId = ltr,ObjectId。
}。
否则。
{。
//如果没有,则在此处创建层。。
var ltr = new LayerTableRecord { Name = layer Name,Color = Color。FromColorIndex(ColorMethod,ByAci,color)};。
layerId = lt . Add(ltr);。
trAddNewlyCreatedDBObject(ltr,true);。
}。
trcommit();。
}。
返回layerId。
}。
添加了以下内容:在这种情况下,db值是通过属性访问器设置的该值等效于 Document doc = AcadApp。document manager . MdiActiveDocument;数据库db = doc,数据库;问候kdub。
然后,要使一个层成为当前层,只需像下面这样简单。
。
dbClayer = layerID5。
。
。
感谢Kerry& trembre的回应。
事实证明,问题一直存在于其他开发人员的代码上,因为如果命令在WALLS层中启动,他的代码就会崩溃。 我现在将当前层切换到WALLS2层,如果我知道他的代码将被运行并且一切都是协同的。 我不认为这是他这边的,因为他是一个更有经验的开发人员,我只是认为我的代码有问题。
我实际上更改了代码,以便在调用例程时传递层名称(感谢Kerry),我也会研究其他一些建议。
非常感谢大家,感谢你没有去托尼·坦齐洛在我的屁股上。
瞎扯
不过,这听起来仍然有点奇怪——切换到WALLS2层以阻止崩溃可能只是解决问题,而不是修复它?这种事情会困扰我——我会等待它做错的任何事情出现并在其他地方咬我。
我认为托尼在沼泽前的名声比他从这里开始以来实际发布的情况要糟糕得多——即使他已经有点激动,这仍然是一次学习经历,因为我之前没有太多考虑扩展方法或更新AutoCAD 2012之后代码的具体细节。我现在正在向我自己的AutoCAD实用程序类添加扩展方法,我已经整理了多年——这是非常酷的东西! trebre,另一个开发人员不再与我们合作,所以我的当权者希望我重做他的代码。结果它以后不会咬我的屁股。
再次感谢。
编辑:kdub 我的代码刚刚遇到了一个类似的问题,谷歌把我带到了这里。经过一些故障排除后,看起来CAD正在抛出错误,因为当前层可能正在解冻。IsFrozen仅在当前层上读取,我正在发布我的发现,以寻找任何其他最终出现在这里的失落灵魂。破坏代码:[命令方法("LayerTest")]。
公共静态空白LayerTest()。
{。
//获取当前层。
string layerName=(string)Application.GetSystemVariable("CLAYER");。
使用(事务tr=Application.DocumentManager.MdiActiveDocument.TransactionManager.StartTransaction())。
{。
LayerTable=(LayerTable)tr.GetObject(Active.Database.LayerTableId,OpenMode.ForWrite);。
如果(layerTable.Has)。
{。
LayerTableRectortLayer=tr.GetObject(layerTable,OpenMode.ForWrite)作为LayerTableRecord;。
//现在尝试解冻它,。
如果(当前层!=null)。
{。
currentLayer.IsFrozen=false;//。
}。
}。
tr.Commit();。
}。
}。
我的解决方案是在尝试解冻之前检查图层是否冻结。
还要检查会话期间是否删除了某个层。检查数据库会返回图层,就像它仍然在那里一样。
页:
[1]