找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1041|回复: 13

[ARX程序]:我的读DWG文件写TXT文件程序

[复制链接]
发表于 2003-9-9 19:25:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
Select类定义:
#include "stdafx.h"
#include "resource.h"
#include "Select.h"
#include "math.h"
#include "afxtempl.h"
#include "dbid.h"
struct resbuf* TextList()
{
        struct resbuf* List;
        //建立所有Layer层高度为1.0的字体选择集       
        List = acutBuildList(
        RTDXF0, "TEXT", // Entity type
        40, 1.0, // Radius 
        8, "0", // Layer 
        0);       
        return List;
}
void ChangeObjectColor(AcDbObjectId ObjectId)
{       
        AcDbEntity *ant;
        int yy=acdbOpenObject(ant, ObjectId, AcDb::kForWrite);
        if(yy != 0)acutPrintf("\nerrorCode=%d",yy);       
        AcDbText *a=AcDbText::cast(ant);       
        a->setColorIndex(10);
    a->close();       
        ant->close();
}

void Select::SelectObject(CArray <AcDbObjectId,AcDbObjectId&> &ObjectCArray)
//CArray类作为形参时变量前应加&才能正确传递值
{
        ads_name SSName,ObjectName;
        AcDbObjectId ObjectId;
        AcGePoint3d start,end;
        double Lengh = 0.0,CalLineLengh = 0.0;
        long Number = 0,nNewSize = 0,nGrowBy = -1;                               
       
        //搜索整个数据库建立选择集
        if (LineList() != NULL)
        {
                acedSSGet("X", NULL, NULL, TextList(), SSName);
                acedSSLength(SSName,&Number);
                acutPrintf("所有符合条件的物体个数为:%d个\n",Number);

                //建立存储选择体数组               
                ObjectCArray.SetSize(nNewSize,nGrowBy);
               
                //把选择集中选择体存储到选择体数组       
                while (Number != 0)
                {
                 Number=Number-1;
                 if (acedSSName(SSName,Number,ObjectName) == RTNORM)
                 {
                        acdbGetObjectId(ObjectId, ObjectName);
                        AcDbEntity* pnt;
                        acdbOpenObject(pnt, ObjectId, AcDb::kForRead);                       
                        ObjectCArray.Add(ObjectId);       
                        pnt->close();
                        ChangeObjectColor(ObjectId);
                        ObjectId = NULL;
                        acedSSDel(ObjectName, SSName);                                               
                 }
                 else
                 {
                        acdbFail("实体名选择集发生错误!\n");
                        Number=0;
                 }
                }
        }
        else
        {
                acutPrintf("acutBuildList选择集时发生错误!");
        }
        return;
}

GetTextXYZ类定义:
#include "stdafx.h"
#include "resource.h"
#include "GetTextXYZ.h"
#include "dbapserv.h"
#include "AFX.h"
#include "dbents.h "
void GetTextXYZ::TextIdToXYZ(AcDbObjectId  TextId,AcGePoint3d& XYZ,double& Text)
{
        AcDbEntity *pEnt;//因此声明一个AcDbEntity类的指针       
        int yy=acdbOpenObject(pEnt, TextId, AcDb::kForRead);//它的功能是通过已知的对象的id用指定的打开       
        AcDbText *p=AcDbText::cast(pEnt);       
        XYZ=p->position();
        Text=atof(p->textString());
        //pEnt->setColorIndex(10);
        pEnt->close();//打开了一个对象,对其操作完成之后,必须用close()函数将它关闭
        p->close();
        return;
}

WriteReadTextFile类定义:
#include "stdafx.h"
#include "resource.h"
#include "WriteReadTextFile.h"
#include "StdArx.h"
void WriteReadTextFile::OpenTextFile(char * &TextFile)
{
        const char* filea ="请选择文件" ;
        char buf[125];
        TextFile=buf;
        struct resbuf* result = acutNewRb(RTSTR);
        int rc=acedGetFileD(filea, NULL, "txt", 1, result);
        if(rc!=RTNORM )acedAlert("打开文件失败!");
        else{TextFile=result->resval.rstring;}
}

void WriteReadTextFile::WriteTextFile(char* TextFile,char* Number,char* xx,char* yy,char* zz)
{       
        char* TZ = "23";//23为特征号

        CStdioFile UserFile;
        UserFile.Open(TextFile,CFile::modeReadWrite);

        UserFile.SeekToEnd();       
        UserFile.WriteString(Number);
        UserFile.WriteString("\n");
        UserFile.WriteString(TZ);
        UserFile.WriteString("\n");
        UserFile.WriteString(xx);
        UserFile.WriteString("\n");
        UserFile.WriteString(yy);
        UserFile.WriteString("\n");
        UserFile.WriteString(zz);
        UserFile.WriteString("\n");

        UserFile.Close();       
}

主函数定义:
#include "StdAfx.h"
#include "StdArx.h"
#include "Select.h"
#include "GetTextXYZ.h"
#include "afxtempl.h"
#include "gepent3d.h"
#include "dbdim.h"
#include "Plot.h"
#include "WriteReadTextFile.h"
// This is command 'PP'
void JZpp()
{
                long nNewSize = 0,nGrowBy = -1,Size = 0,Number = 0;
                AcDbObjectId TextId;
                AcGePoint3d XYZ;
                double Text = 0.0;
                char NN[12],XX[12],YY[12],ZZ[12];
                char* stringFile;

                ///////////定义存储ObjectID的数组Text//////////
                CArray <AcDbObjectId,AcDbObjectId&> Textgroup;
                Textgroup.SetSize(nNewSize,nGrowBy);
                ///////////////////////////////////////////////

                Select SS;//定义一个选择的类
                SS.SelectObject(Textgroup);
                Size = Textgroup.GetSize();               
                GetTextXYZ LL;//定义一个转换ObjectID为坐标的类
                //Plot PP;
                WriteReadTextFile WW;//定义一个读写TextFile的类
                WW.OpenTextFile(stringFile);               

                //////////////写入总点数///////////////////////
                CStdioFile UserFile;
                UserFile.Open(stringFile,CFile::modeReadWrite);
                acdbRToS(Size, 2, 0, NN);
                UserFile.WriteString(NN);
                UserFile.WriteString("\n");
                UserFile.Close();
                ///////////////////////////////////////////////

                //////////////显示进度条///////////////////////                    
            acedSetStatusBarProgressMeter("正在写入数据,请稍候...", 0, Size);//显示一个SIZE长度的进度条
                ///////////////////////////////////////////////               
                /////////写入各点的点号、特征号、坐标//////////               
                while (Number < Size)
                        {
                        TextId = Textgroup.GetAt(Number);                       
                        LL.TextIdToXYZ(TextId,XYZ,Text);                       
                        XYZ.z = Text;
                        //acutPrintf("\n%d",Size);
                        acutPrintf("\nNO.%D,%f,%f,%f",Number,XYZ.x,XYZ.y,XYZ.z);                       
                        acdbRToS((Number+1), 2, 0, NN);//将double类型变量转换为char[12]类型变量
                        acdbRToS(XYZ.x, 2, 2, XX);
                        acdbRToS(XYZ.y, 2, 2, YY);
                        acdbRToS(XYZ.z, 2, 2, ZZ);
                        WW.WriteTextFile(stringFile,NN,XX,YY,ZZ);
                        //PP.creatPoint(XYZ);
                //////////////控制进度条的显示///////////////////////
                        Sleep(5);//产生5秒钟的停滞
            acedSetStatusBarProgressMeterPos(Number);//根据Number来显示进度情况
                /////////////////////////////////////////////////////
                        ++ Number;
                        }
                /////////////////////////////////////////////////

                //////////////消毁进度条/////////////////////////                    
            acedRestoreStatusBar();//消毁进度条
                /////////////////////////////////////////////////

                acedAlert("写入数据已完成,谢谢使用!");
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-10-26 16:00:53 | 显示全部楼层
做什么用的啊?可以讲讲马
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-11-14 23:19:15 | 显示全部楼层
这是我将广东中海达公司(卖GPS海洋测量设备的公司)GPS软件的出图数据转化为广州开思软件公司的软件可以处理的数据格式而编制的程序。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-11-15 11:01:17 | 显示全部楼层
to于松荣谢谢阿!
我想我把程序编好了也会向大家公布的,希望大家多多指点,也希望能给大家一点帮助!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-11-18 19:52:28 | 显示全部楼层
没什么用的!只对AcDbText对象操作!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-11-18 23:58:11 | 显示全部楼层
此程序只为解决工作中的问题,仅供需要参考者的参考,没有别的意思。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-11-26 12:32:40 | 显示全部楼层
#include "Select.h" ???
自己写的文件阿?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-3 17:53:40 | 显示全部楼层
怎么打开 DWG 文件啊?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-5 11:44:48 | 显示全部楼层
先看看
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-7 11:19:36 | 显示全部楼层
我想打开 DWG 文件该怎么写啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-22 07:15:38 | 显示全部楼层
怎么打开?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-23 11:46:20 | 显示全部楼层
做什么用的啊?可以讲讲马
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-12-29 15:13:13 | 显示全部楼层
在cad中加载程序后,输入pp并选择一个已存在的TXT文件保存,试试。把DWG文件数据转化为TXT文件数据。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-1-2 16:08:30 | 显示全部楼层
向版主提个问题:为什么下载东西需要爱心贝呢? 这样对于我们这些菜鸟有些不公平啊,
我们才是需要学习需要进步的,你这样不利于像我等一些菜鸟的进步!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-21 10:38 , Processed in 0.357238 second(s), 56 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表