tianlu6816 发表于 2017-3-4 09:45:46

在项目中后台创建拉伸实体,请问出现这种异常怎么解决呢

异常: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:22

就是没给事务吧

新建一个事务,把创建草图,创建拉伸部分放进去。

tianlu6816 发表于 2017-3-4 22:05:00

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,这是为什么呢?

No.54 发表于 2017-3-4 22:41:29

tianlu6816 发表于 2017-3-4 22:05
又出现了这样的异常:Starting a new transaction is not permitted. It could be because another trans ...

还是事务的问题啊,你加的事务放在哪里了?

tianlu6816 发表于 2017-3-5 15:13:15

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();
            }
            
      }

书痴 发表于 2017-3-6 11:01:01

tianlu6816 发表于 2017-3-5 15:13
这是我加的事务:
internal SketchPlane CreateSketchPlane(XYZ normal, XYZ origin)
      {


不能这样加,sketchplan不需要加事务

tianlu6816 发表于 2017-3-6 12:52:41

书痴 发表于 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.
请问这怎么处理呢

书痴 发表于 2017-3-6 15:14:25

tianlu6816 发表于 2017-3-6 12:52
谢谢你,刚才的异常解决了,但是在这句代码:
Family newFamily = familyDoc.LoadFamily(doc)
出现了异常 ...

修改后的代码截个图发上来看看

tianlu6816 发表于 2017-3-6 16:25:55

书痴 发表于 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();
            }

      }
    }

书痴 发表于 2017-3-7 14:48:05

tianlu6816 发表于 2017-3-6 16:25

   
    public cl ...

你的加载族和创建族实例都没有加事务,把他们分别加上事务,再看看问题

tianlu6816 发表于 2017-3-7 16:29:36

书痴 发表于 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;
      }
    }

书痴 发表于 2017-3-8 16:12:35

tianlu6816 发表于 2017-3-7 16:29
如果用Add-In Manage(Manual Mode)这个模式运行代码,还是原来的问题:The document must not be modifia ...

白天上班,我晚上帮你调试一下。

书痴 发表于 2017-3-9 08:39:32

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:下次提问最好能够用编译器上的截图,加代码。。这样比较好看

tianlu6816 发表于 2017-3-9 08:58:07

书痴 发表于 2017-3-9 08:39
昨天晚上给你调试了一下,有这么几个问题,第一,载入族时不需要加事务,我看了下,开始搞错了,它默认就 ...

太感谢了,好的,有问题一定附上截图
页: [1]
查看完整版本: 在项目中后台创建拉伸实体,请问出现这种异常怎么解决呢