在项目中后台创建拉伸实体,请问出现这种异常怎么解决呢
异常:Modifyingis forbidden because the document has no open transaction我 的代码:
public class GetExtrusionInProject : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIApplication uiApp = commandData.Application;
Autodesk.Revit.ApplicationServices.Application app = uiApp.Application;
UIDocument uidoc = uiApp.ActiveUIDocument;
Autodesk.Revit.DB.Document doc = uidoc.Document;
Autodesk.Revit.Creation.Document creationDoc = doc.Create;
//创建族文档
string fileName = @"d:\Users\tianlu\Desktop\公制常规模型.rft";
Autodesk.Revit.DB.Document familyDoc = app.NewFamilyDocument(fileName);
try
{
if (familyDoc.IsFamilyDocument)
{
MessageBox.Show("这是族文档");
CreateExtrusion ce = new CreateExtrusion();
ce._app = app;
ce._familyDoc = familyDoc;
FamilyItemFactory fif = ce._familyDoc.FamilyCreate;
ce.CreateExtrusion1(fif);//创建拉伸实体
}
}
catch (Exception e)
{
message = e.Message;
return Result.Failed;
}
Family newFamily = familyDoc.LoadFamily(doc);
FamilySymbolSet fSymbol = newFamily.Symbols;
foreach (FamilySymbol fs in fSymbol)
{
FamilyInstance fInstance = creationDoc.NewFamilyInstance(new XYZ(0, 0, 0), fs, StructuralType.NonStructural);
}
return Result.Succeeded;
}
}
//创建拉伸实体的类
public class CreateExtrusion
{
public Autodesk.Revit.ApplicationServices.Application _app;
public Autodesk.Revit.DB.Document _familyDoc;
//创建工作平面的函数,输入为平面的原点和法向量
internal SketchPlane CreateSketchPlane(XYZ normal, XYZ origin)
{
Plane geometryPlane = _app.Create.NewPlane(normal, origin);
if (geometryPlane == null)
{
return null;
}
SketchPlane plane = SketchPlane.Create(_familyDoc, geometryPlane);
if (plane == null)
{
return null;
}
return plane;
}
//创建用于拉伸的线
private CurveArrArray CreateExtrusionProfile()
{
CurveArrArray curveArrArray = new CurveArrArray();
CurveArray curveArray1 = new CurveArray();
XYZ p0 = XYZ.Zero;
XYZ p1 = new XYZ(10, 0, 0);
XYZ p2 = new XYZ(10, 10, 0);
XYZ p3 = new XYZ(0, 10, 0);
Line line1 = Line.CreateBound(p0, p1);
Line line2 = Line.CreateBound(p1, p2);
Line line3 = Line.CreateBound(p2, p3);
Line line4 = Line.CreateBound(p3, p0);
curveArray1.Append(line1);
curveArray1.Append(line2);
curveArray1.Append(line3);
curveArray1.Append(line4);
curveArrArray.Append(curveArray1);
return curveArrArray;
}
//创建拉伸实体
public void CreateExtrusion1(FamilyItemFactory familyCreator)
{
CurveArrArray curveArrArray = CreateExtrusionProfile();
SketchPlane sketchPlane = CreateSketchPlane(XYZ.BasisZ, XYZ.Zero);
Extrusion rectExtrusion = familyCreator.NewExtrusion(true, curveArrArray, sketchPlane, 10);
XYZ transPoint1 = new XYZ(-16, 0, 0);
ElementTransformUtils.MoveElement(_familyDoc, rectExtrusion.Id, transPoint1);
}
}
就是没给事务吧
新建一个事务,把创建草图,创建拉伸部分放进去。 No.54 发表于 2017-3-4 18:05
就是没给事务吧
新建一个事务,把创建草图,创建拉伸部分放进去。
又出现了这样的异常:Starting a new transaction is not permitted. It could be because another transaction already started and has not been completed yet, or the document is in a state in which it cannot start a new transaction,这是为什么呢? tianlu6816 发表于 2017-3-4 22:05
又出现了这样的异常:Starting a new transaction is not permitted. It could be because another trans ...
还是事务的问题啊,你加的事务放在哪里了? No.54 发表于 2017-3-4 22:41
还是事务的问题啊,你加的事务放在哪里了?
这是我加的事务:
internal SketchPlane CreateSketchPlane(XYZ normal, XYZ origin)
{
using (Transaction tr = new Transaction(_familyDoc))
{
tr.Start("CreateSketchPlane");
Plane geometryPlane = _app.Create.NewPlane(normal, origin);
if (geometryPlane == null)
{
return null;
}
SketchPlane plane = SketchPlane.Create(_familyDoc, geometryPlane);
if (plane == null)
{
return null;
}
tr.Commit();
return plane;
}
}
//创建拉伸实体
public void CreateExtrusion1(FamilyItemFactory familyCreator)
{
using (Transaction tr = new Transaction(_familyDoc))
{
tr.Start("CreateExtrusion");
CurveArrArray curveArrArray = CreateExtrusionProfile();
SketchPlane sketchPlane = CreateSketchPlane(XYZ.BasisZ, XYZ.Zero);
Extrusion rectExtrusion = familyCreator.NewExtrusion(true, curveArrArray, sketchPlane, 10);
XYZ transPoint1 = new XYZ(-16, 0, 0);
ElementTransformUtils.MoveElement(_familyDoc, rectExtrusion.Id, transPoint1);
tr.Commit();
}
}
tianlu6816 发表于 2017-3-5 15:13
这是我加的事务:
internal SketchPlane CreateSketchPlane(XYZ normal, XYZ origin)
{
不能这样加,sketchplan不需要加事务 书痴 发表于 2017-3-6 11:01
不能这样加,sketchplan不需要加事务
谢谢你,刚才的异常解决了,但是在这句代码:
Family newFamily = familyDoc.LoadFamily(doc)
出现了异常:The document must not be modifiable before calling LoadFamily. Any open transaction must be closed prior the call.
请问这怎么处理呢
tianlu6816 发表于 2017-3-6 12:52
谢谢你,刚才的异常解决了,但是在这句代码:
Family newFamily = familyDoc.LoadFamily(doc)
出现了异常 ...
修改后的代码截个图发上来看看 书痴 发表于 2017-3-6 15:14
修改后的代码截个图发上来看看
public class GetExtrusionInProject : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIApplication uiApp = commandData.Application;
Autodesk.Revit.ApplicationServices.Application app = uiApp.Application;
UIDocument uidoc = uiApp.ActiveUIDocument;
Autodesk.Revit.DB.Document doc = uidoc.Document;
Autodesk.Revit.Creation.Document creationDoc = doc.Create;
//创建族文档
string fileName = @"d:\Users\tianlu\Desktop\公制常规模型.rft";
Autodesk.Revit.DB.Document familyDoc = app.NewFamilyDocument(fileName);
try
{
if (familyDoc.IsFamilyDocument)
{
MessageBox.Show("这是族文档");
CreateExtrusion ce = new CreateExtrusion();
ce._app = app;
ce._familyDoc = familyDoc;
FamilyItemFactory fif = ce._familyDoc.FamilyCreate;
//创建拉伸实体
ce.CreateExtrusion1(fif);
}
}
catch (Exception e)
{
message = e.Message;
return Result.Failed;
}
//在当前项目中加载族
Family newFamily = familyDoc.LoadFamily(doc);
//获取加载到项目中的族类型
FamilySymbolSet fSymbol = newFamily.Symbols;
foreach (FamilySymbol fs in fSymbol)
{
//创建族实例
FamilyInstance fInstance = creationDoc.NewFamilyInstance(new XYZ(0, 0, 0), fs, StructuralType.NonStructural);
}
return Result.Succeeded;
}
}
//创建拉伸实体的类
public class CreateExtrusion
{
public Autodesk.Revit.ApplicationServices.Application _app;
public Autodesk.Revit.DB.Document _familyDoc;
//创建工作平面的函数,输入为平面的原点和法向量
internal SketchPlane CreateSketchPlane(XYZ normal, XYZ origin)
{
Plane geometryPlane = _app.Create.NewPlane(normal, origin);
if (geometryPlane == null)
{
return null;
}
SketchPlane plane = SketchPlane.Create(_familyDoc, geometryPlane);//出现异常
if (plane == null)
{
return null;
}
return plane;
}
//创建用于拉伸的线
private CurveArrArray CreateExtrusionProfile()
{
CurveArrArray curveArrArray = new CurveArrArray();
CurveArray curveArray1 = new CurveArray();
XYZ p0 = XYZ.Zero;
XYZ p1 = new XYZ(10, 0, 0);
XYZ p2 = new XYZ(10, 10, 0);
XYZ p3 = new XYZ(0, 10, 0);
Line line1 = Line.CreateBound(p0, p1);
Line line2 = Line.CreateBound(p1, p2);
Line line3 = Line.CreateBound(p2, p3);
Line line4 = Line.CreateBound(p3, p0);
curveArray1.Append(line1);
curveArray1.Append(line2);
curveArray1.Append(line3);
curveArray1.Append(line4);
curveArrArray.Append(curveArray1);
return curveArrArray;
}
//创建拉伸实体
public void CreateExtrusion1(FamilyItemFactory familyCreator)
{
using (Transaction tr = new Transaction(_familyDoc))
{
tr.Start("createExtrusion");
CurveArrArray curveArrArray = CreateExtrusionProfile();
SketchPlane sketchPlane = CreateSketchPlane(XYZ.BasisZ, XYZ.Zero);
Extrusion rectExtrusion = familyCreator.NewExtrusion(true, curveArrArray, sketchPlane, 10);
XYZ transPoint1 = new XYZ(-16, 0, 0);
ElementTransformUtils.MoveElement(_familyDoc, rectExtrusion.Id, transPoint1);
tr.Commit();
}
}
} tianlu6816 发表于 2017-3-6 16:25
public cl ...
你的加载族和创建族实例都没有加事务,把他们分别加上事务,再看看问题 书痴 发表于 2017-3-7 14:48
你的加载族和创建族实例都没有加事务,把他们分别加上事务,再看看问题 ...
如果用Add-In Manage(Manual Mode)这个模式运行代码,还是原来的问题:The document must not be modifiable before calling LoadFamily. Any open transaction must be closed prior the call.
代码修改:
public class GetExtrusionInProject : IExternalCommand
{
private Family _newfamily;
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIApplication uiApp = commandData.Application;
Autodesk.Revit.ApplicationServices.Application app = uiApp.Application;
UIDocument uidoc = uiApp.ActiveUIDocument;
Autodesk.Revit.DB.Document doc = uidoc.Document;
Autodesk.Revit.Creation.Document creationDoc = doc.Create;
//创建族文档
string fileName = @"d:\Users\tianlu\Desktop\公制常规模型.rft";
Autodesk.Revit.DB.Document familyDoc = app.NewFamilyDocument(fileName);
try
{
if (familyDoc.IsFamilyDocument)
{
MessageBox.Show("这是族文档");
CreateExtrusion ce = new CreateExtrusion();
ce._app = app;
ce._familyDoc = familyDoc;
FamilyItemFactory fif = ce._familyDoc.FamilyCreate;
//创建拉伸实体
ce.CreateExtrusion1(fif);
}
}
catch (Exception e)
{
message = e.Message;
return Result.Failed;
}
//在当前项目中加载族
using (Transaction tr = new Transaction(doc))
{
tr.Start("loadFamily");
_newfamily = familyDoc.LoadFamily(doc);
tr.Commit();
}
//获取加载到项目中的族类型
FamilySymbolSet fSymbol = _newfamily.Symbols;
using (Transaction tr = new Transaction(doc))
{
tr.Start("createFamilyInstance");
foreach (FamilySymbol fs in fSymbol)
{
//创建族实例
FamilyInstance fInstance = creationDoc.NewFamilyInstance(new XYZ(0, 0, 0), fs, StructuralType.NonStructural);
}
tr.Commit();
}
return Result.Succeeded;
}
} tianlu6816 发表于 2017-3-7 16:29
如果用Add-In Manage(Manual Mode)这个模式运行代码,还是原来的问题:The document must not be modifia ...
白天上班,我晚上帮你调试一下。 tianlu6816 发表于 2017-3-7 16:29
如果用Add-In Manage(Manual Mode)这个模式运行代码,还是原来的问题:The document must not be modifia ...
昨天晚上给你调试了一下,有这么几个问题,第一,载入族时不需要加事务,我看了下,开始搞错了,它默认就有个事务所以不用加,所以第一,要把载入族时事务取消。
第二,这个解决后还有个问题,你在创建族实例之前要先将类型激活
在 FamilyInstance fInstance = creationDoc.NewFamilyInstance(new XYZ(0, 0, 0), fs, StructuralType.NonStructural);之前,加上一句fs.Activate();这样应该就能达到你要的效果。
ps:下次提问最好能够用编译器上的截图,加代码。。这样比较好看 书痴 发表于 2017-3-9 08:39
昨天晚上给你调试了一下,有这么几个问题,第一,载入族时不需要加事务,我看了下,开始搞错了,它默认就 ...
太感谢了,好的,有问题一定附上截图
页:
[1]