用户登录
找回密码
立即注册
搜索
热搜: 视频教程
查看: 9129|回复: 13

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

[复制链接]

2

主题

9

帖子

56

积分

注册会员

Rank: 2

积分
56
发表于 2017-3-4 09:45:46 | 显示全部楼层 |阅读模式
异常:Modifying  is forbidden because the document has no open transaction

我 的代码:
    [Transaction(TransactionMode.Automatic)]
    [Regeneration(RegenerationOption.Manual)]
    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);
        }
    }




回复

使用道具 举报

0

主题

2

帖子

28

积分

新手上路

Rank: 1

积分
28
发表于 2017-3-4 18:05:22 | 显示全部楼层
就是没给事务吧

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

使用道具 举报

2

主题

9

帖子

56

积分

注册会员

Rank: 2

积分
56
 楼主| 发表于 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,这是为什么呢?
回复

使用道具 举报

0

主题

2

帖子

28

积分

新手上路

Rank: 1

积分
28
发表于 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 ...

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

使用道具 举报

2

主题

9

帖子

56

积分

注册会员

Rank: 2

积分
56
 楼主| 发表于 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();
            }
            
        }

回复

使用道具 举报

16

主题

79

帖子

587

积分

高级会员

Rank: 4

积分
587
发表于 2017-3-6 11:01:01 | 显示全部楼层
tianlu6816 发表于 2017-3-5 15:13
这是我加的事务:
internal SketchPlane CreateSketchPlane(XYZ normal, XYZ origin)
        {

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

使用道具 举报

2

主题

9

帖子

56

积分

注册会员

Rank: 2

积分
56
 楼主| 发表于 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.
请问这怎么处理呢
回复

使用道具 举报

16

主题

79

帖子

587

积分

高级会员

Rank: 4

积分
587
发表于 2017-3-6 15:14:25 | 显示全部楼层
tianlu6816 发表于 2017-3-6 12:52
谢谢你,刚才的异常解决了,但是在这句代码:
Family newFamily = familyDoc.LoadFamily(doc)
出现了异常 ...

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

使用道具 举报

2

主题

9

帖子

56

积分

注册会员

Rank: 2

积分
56
 楼主| 发表于 2017-3-6 16:25:55 | 显示全部楼层
书痴 发表于 2017-3-6 15:14
修改后的代码截个图发上来看看

[Transaction(TransactionMode.Manual)]
    [Regeneration(RegenerationOption.Manual)]
    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();
            }

        }
    }
回复

使用道具 举报

16

主题

79

帖子

587

积分

高级会员

Rank: 4

积分
587
发表于 2017-3-7 14:48:05 | 显示全部楼层
tianlu6816 发表于 2017-3-6 16:25
[Transaction(TransactionMode.Manual)]
    [Regeneration(RegenerationOption.Manual)]
    public cl ...

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

使用道具 举报

2

主题

9

帖子

56

积分

注册会员

Rank: 2

积分
56
 楼主| 发表于 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.
代码修改:
[Transaction(TransactionMode.Manual)]
    [Regeneration(RegenerationOption.Manual)]
    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;
        }
    }
回复

使用道具 举报

16

主题

79

帖子

587

积分

高级会员

Rank: 4

积分
587
发表于 2017-3-8 16:12:35 | 显示全部楼层
tianlu6816 发表于 2017-3-7 16:29
如果用Add-In Manage(Manual Mode)这个模式运行代码,还是原来的问题:The document must not be modifia ...

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

使用道具 举报

16

主题

79

帖子

587

积分

高级会员

Rank: 4

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

使用道具 举报

2

主题

9

帖子

56

积分

注册会员

Rank: 2

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

太感谢了,好的,有问题一定附上截图
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4 © 2001-2013 Comsenz Inc.

京ICP备17008402号-1  |  Archiver  |  手机版  |  小黑屋  |  橄榄山BIM论坛    

点击立刻咨询
快速回复 返回顶部 返回列表