乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 105|回复: 7

【请教】关于打开图纸炸碎另存无效的问题

[复制链接]

3

主题

11

帖子

1

银币

初来乍到

Rank: 1

铜币
23
发表于 2012-7-27 12:05:00 | 显示全部楼层 |阅读模式
最近在做处理历史图纸的工作,过程如下:
1、打开原图纸,剔除不需处理的信息,另存为*-1.dwg;
2、打开原图纸,剔除需要处理的信息,另存为*-2.dwg;
3、打开*-1.dwg,执行explode命令,另存为*-3.dwg;
4、打开*-3.dwg,提取处理的信息,另存为*.xls;
5、打开*-2.dwg,添加从*.xls中读取的信息,另存为*-new.dwg。
编写的程序前2步执行良好,但是第3步发生问题,炸碎的图形保存后,仍是炸碎前的样子。不知道问题出在哪里,请大家伙提供宝贵意见和指导,谢谢!
第3步的程序如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Text.RegularExpressions;
using Autodesk..DatabaseServices;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Colors;
using Autodesk.AutoCAD.GraphicsInterface;
using Autodesk.AutoCAD.EditorInput;
[assembly: CommandClass(typeof(CNPTCAD.testGetInfoFromDwg))]
namespace CNPTCAD
{
    class testGetInfoFromDwg
    {
        [CommandMethod("testGetInfoFromDwg",CommandFlags.Session)]
        //[CommandMethod("testGetInfoFromDwg")]
        public static void DotestGetInfoFromDwg()
        {           
            OpenFileDialog openFileDialog3 = new OpenFileDialog();
            openFileDialog3.Multiselect = false;
            openFileDialog3.Filter = "AutoCAD  files  (*.dwg)|*.dwg";
            openFileDialog3.FilterIndex = 0;
            openFileDialog3.RestoreDirectory = true;
            openFileDialog3.Title = "test";
            
            if (openFileDialog3.ShowDialog() == DialogResult.OK)
            {
                String filename = openFileDialog3.FileName;
                Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.Open(filename, false);
                DocumentLock doclock = doc.LockDocument();
                int flag = 0;
                if(flag == 0){
                    doc.SendStringToExecute("_ai_selall\n", false, false, true);
                    flag = 1;
                    //Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog(flag.ToString());
                }
               if(flag == 1){
                    doc.SendStringToExecute("explode\n", false, false, true);
                    flag = 2;
                    //Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog(flag.ToString());
                }               
               if (flag == 2)
               {
                   doc.Database.SaveAs(filename.Substring(0, filename.Length - 10) + "_3.dwg", DwgVersion.Newest);   
                   flag = 3;
                   //Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog(flag.ToString());
               }
                doclock.Dispose();
                //下面这句屏蔽的话,可以看到原图形确实被炸碎了
                //doc.CloseAndDiscard();
            }
           
        }
    }
}
回复

使用道具 举报

8

主题

138

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
170
发表于 2012-7-27 17:43:00 | 显示全部楼层
//doc.CloseAndDiscard();
顾名思义,保存并丢弃,就是保存但是放弃对数据库的操作
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2012-7-27 21:03:00 | 显示全部楼层
楼上的说法貌似合理,但应该是对于当前文件来说吧?
doc.Database.SaveAs(filename.Substring(0, filename.Length - 10) + "_3.dwg", DwgVersion.Newest);  这句是另存到了新的文件哦,新的文件情况怎样?
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2012-7-27 21:09:00 | 显示全部楼层
1,我妹见过这样的做法,不过看上去应该是可行的;
2,同二楼的思路,把doc.CloseAndDiscard(); 改成doc. CloseAndSave(string fileName);试试,看看新旧两个文件都是什么情况;
3,  DocumentLock doclock = doc.LockDocument();去掉或用LockDocument(DocumentLockMode lockMode, string globalCommandName, string localCommandName, bool promptIfFails),lockMode多用几个试试
           
回复

使用道具 举报

3

主题

11

帖子

1

银币

初来乍到

Rank: 1

铜币
23
发表于 2012-7-30 09:00:00 | 显示全部楼层
首先感谢楼上两位的帮助!
1、我加//doc.CloseAndDiscard(); 的意思是想说,原图不关闭可以看到确实被炸开了,但是另存的dwg却发现没有炸开;
2、doc. CloseAndSave(string fileName);这句我也试了,应该是执行原图保存和关闭,但实际上也没有执行,只是关闭了,炸开的效果没有保存;
3、DocumentLock doclock = doc.LockDocument();这句不要的话,是要报错的,因为有对文件的操作。
目前我是用了SendStringToExecute的方法,分别执行_ai_selal, explode, _qsave, _close 来完成功能的,虽然比较笨,但是还算好用,呵呵。
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2012-7-31 08:47:00 | 显示全部楼层
尽量不要调用命令 我的建议 SendStringToExecute也不要用 这个方法没什么用
回复

使用道具 举报

8

主题

138

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
170
发表于 2012-7-31 20:02:00 | 显示全部楼层
支持斑竹,还是用invoke好
回复

使用道具 举报

3

主题

11

帖子

1

银币

初来乍到

Rank: 1

铜币
23
发表于 2012-8-1 11:36:00 | 显示全部楼层
确实如此,因为不确定它的执行时间和顺序,我已经改了代码
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-6-29 14:04 , Processed in 1.244240 second(s), 68 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表