2532 lines
70 KiB
C++
2532 lines
70 KiB
C++
/********************************************************************
|
||
created: 2006/04/12
|
||
created: 12:4:2006 16:19
|
||
filename: f:\tg_dev\telecdev\tapi\pubcmd.cpp
|
||
file path: f:\tg_dev\telecdev\tapi
|
||
file base: pubcmd
|
||
file ext: cpp
|
||
author: 沈睿
|
||
|
||
purpose: 上华水电公共命令
|
||
*********************************************************************/
|
||
|
||
#include "stdafx.h"
|
||
|
||
//#include <arxtools.h>
|
||
#include <dbPipe.h> //管线
|
||
#include <dbidmap.h>
|
||
//#include <dbwall.h>
|
||
//#include <DbBlockInsert.h>
|
||
#include <dbequipment.h>
|
||
|
||
#include "resource.h"
|
||
#include "acedinpt.h"
|
||
#include "tapi.h"
|
||
#include "acedxref.h"
|
||
#include "xblock.h"
|
||
#include <actrans.h>
|
||
#include <dbhatch.h>
|
||
#include <dbelipse.h>
|
||
#include <dbspline.h>
|
||
#include "CompareDwg.h"
|
||
#include "DictionaryViewerDlg.h"
|
||
//#include "zip.h"
|
||
//#include "unzip.h"
|
||
|
||
|
||
|
||
//extern GEOAPI int DragPickSet1(PickSet &ss, XPoint &ptBase);
|
||
extern GEOAPI void LoadConfig();
|
||
|
||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
// 加载高级选项
|
||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
void LoadConfigCmd()
|
||
{
|
||
|
||
LoadConfig();//tch_kernal导出的
|
||
}
|
||
|
||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
// 依线正交
|
||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
namespace
|
||
{
|
||
bool g_bDefault = false;
|
||
bool g_bESC = false;
|
||
bool g_bMouseLeft = false;
|
||
BOOL KeyboardMouseHook(MSG* pMsg)
|
||
{
|
||
BOOL bRet=FALSE;
|
||
switch(pMsg->message)
|
||
{
|
||
case WM_LBUTTONDOWN:
|
||
{
|
||
g_bMouseLeft = true;
|
||
break;
|
||
}
|
||
case WM_RBUTTONDOWN:
|
||
{
|
||
g_bDefault = true;
|
||
break;
|
||
}
|
||
case WM_KEYDOWN:
|
||
{
|
||
if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_SPACE)
|
||
{
|
||
g_bDefault = true;
|
||
}
|
||
else if (pMsg->wParam == VK_ESCAPE)
|
||
{
|
||
g_bESC = true;
|
||
}
|
||
break;
|
||
}
|
||
default:
|
||
break;
|
||
}
|
||
return bRet;
|
||
}
|
||
}
|
||
|
||
void SetSnapAngByLineCmd()
|
||
{
|
||
// cet 2018.1.25 modify 支持ucs
|
||
// double s_angle(0);
|
||
// adsout << _T("注意:仅单AutoCAD正交设为开状态[F8切换]时起作用!");
|
||
// int err_value=get_line_angle(s_angle);
|
||
// if(err_value == RTNORM){
|
||
// xg_setvar(_T("snapang"), s_angle);
|
||
// }
|
||
// else
|
||
// xg_setvar(_T("snapang"), 0);
|
||
g_bDefault = false;
|
||
g_bESC = false;
|
||
g_bMouseLeft = false;
|
||
double dAngle = 0.0;
|
||
adsout << _T("注意:仅单AutoCAD正交设为开状态[F8切换]时起作用!");
|
||
acedRegisterFilterWinMsg(KeyboardMouseHook);
|
||
int nRet = get_line_angle(dAngle); // 此函数返回值无法很好区分当前操作状态,添加钩子辅助判断
|
||
acedRemoveFilterWinMsg(KeyboardMouseHook);
|
||
if(!g_bESC && // 未按ESC
|
||
!g_bDefault&& // 非默认操作
|
||
nRet == RTNORM)
|
||
{
|
||
dAngle = Wcs2Ucs(dAngle);
|
||
xg_setvar(_T("snapang"), dAngle);
|
||
}
|
||
else if (g_bDefault)
|
||
{
|
||
xg_setvar(_T("snapang"), 0);
|
||
}
|
||
}
|
||
|
||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
// 绘多段线
|
||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
||
void DrawCustomPoly()
|
||
{
|
||
Entity ent;
|
||
long len = g_ssPickFirst.Length();
|
||
if(len == 1){
|
||
ent = g_ssPickFirst[0L];
|
||
}
|
||
XPoly2D poly2d;
|
||
if(GetOpenPoly2D(_T("\n绘制POLYLINE"), poly2d)!=RTNORM)
|
||
return;
|
||
poly2d.Make();
|
||
Entity entLast;
|
||
entLast.GetLast();
|
||
if(!ent)
|
||
return;
|
||
CString csLayer, csLineType;
|
||
double dThick(0);
|
||
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbPolyline, pEnt);
|
||
if(pEnt){
|
||
TCHAR *chlayer = pEnt->layer();
|
||
csLayer = chlayer;
|
||
delete [] chlayer;
|
||
TCHAR *szLineType = pEnt->linetype();
|
||
csLineType = szLineType;
|
||
delete [] szLineType;
|
||
pEnt->getConstantWidth(dThick);
|
||
|
||
}
|
||
OPENOBJ_END();
|
||
|
||
OPENOBJ_BEGIN(entLast, AcDb::kForWrite, AcDbPolyline, pEnt2);
|
||
if(pEnt2){
|
||
pEnt2->setLayer(csLayer);
|
||
pEnt2->setLinetype(csLineType);
|
||
pEnt2->setConstantWidth(dThick);
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
|
||
|
||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
// 图纸保护
|
||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
class TExplodeSet: public AcDbVoidPtrArray {
|
||
public:
|
||
TMasterProperties m_prop;
|
||
};
|
||
|
||
//在图块内分解上华对象
|
||
BOOL ExplodeWithinBlock(AcDbBlockTableRecord *pRec, BOOL bExp3d)
|
||
{
|
||
AcDbBlockTableRecordIterator *pRecIter=NULL;
|
||
if(pRec->newIterator(pRecIter)==Acad::eOk && pRecIter) {
|
||
} else
|
||
return FALSE;
|
||
|
||
//对块表记录中的对象进行分解
|
||
//AcDbVoidPtrArray entSetNew;
|
||
DList<TExplodeSet> lstNewSet;
|
||
for(pRecIter->start(); !pRecIter->done(); pRecIter->step()) {
|
||
AcDbEntity *pEnt=NULL;
|
||
if(pRecIter->getEntity(pEnt, AcDb::kForWrite)==Acad::eOk) {
|
||
ASSERT(pEnt);
|
||
if(pEnt->isKindOf(TDbEntity::desc()) ||
|
||
pEnt->isKindOf(TDbCurveEntity::desc()) ||
|
||
pEnt->isKindOf(TDbBlockInsert::desc())) {
|
||
//分解对象
|
||
TExplodeSet *pNewSet=new TExplodeSet;
|
||
pEnt->explode(*pNewSet);
|
||
pNewSet->m_prop.m_idLayer=pEnt->layerId();
|
||
pNewSet->m_prop.m_idLineType=pEnt->linetypeId();
|
||
pNewSet->m_prop.m_nColor=pEnt->colorIndex();
|
||
lstNewSet.Append(pNewSet);
|
||
}
|
||
pEnt->close();
|
||
}
|
||
}
|
||
//对块表中的上华对象进行删除
|
||
for(pRecIter->start(); !pRecIter->done(); pRecIter->step()) {
|
||
AcDbEntity *pEnt=NULL;
|
||
if(pRecIter->getEntity(pEnt, AcDb::kForWrite)==Acad::eOk) {
|
||
ASSERT(pEnt);
|
||
if(pEnt->isKindOf(TDbEntity::desc()) ||
|
||
pEnt->isKindOf(TDbCurveEntity::desc()) ||
|
||
pEnt->isKindOf(TDbBlockInsert::desc())) {
|
||
pEnt->erase(); //删除对象
|
||
}
|
||
pEnt->close();
|
||
}
|
||
}
|
||
|
||
for(int idx=0; idx<lstNewSet.Length(); idx++) {
|
||
TExplodeSet &entSetNew=*lstNewSet[idx];
|
||
//加入新转换的对象
|
||
int num=entSetNew.length();
|
||
for(int n=0; n<num; n++) {
|
||
AcDbEntity *pNewEnt=(AcDbEntity *)entSetNew[n];
|
||
VERIFY(pRec->appendAcDbEntity(pNewEnt)==Acad::eOk);
|
||
pNewEnt->close();
|
||
}
|
||
}
|
||
delete pRecIter;
|
||
return TRUE;
|
||
}
|
||
|
||
int HexString(char *szBuf1, int nLen, char *szHexBuf)
|
||
{
|
||
unsigned char *szBuf=(unsigned char *)szBuf1;
|
||
char szOut[256]="";
|
||
//int nLen=strlen(szBuf);
|
||
for(int i=0; i<nLen; i++) {
|
||
char szHex[10]="";
|
||
itoa(szBuf[i], szHex, 16);
|
||
//sprintf(szHex, "%x", (unsigned int)szBuf[i]);
|
||
int nCharLen=(int)strlen(szHex);
|
||
ASSERT(nCharLen<=2 && nCharLen>=1);
|
||
if(nCharLen==1) {
|
||
szHex[1]=szHex[0];
|
||
szHex[0]='0';
|
||
szHex[2]=0;
|
||
}
|
||
strcat(szOut, &szHex[strlen(szHex)-2]);
|
||
}
|
||
strcpy(szHexBuf, szOut);
|
||
return TRUE;
|
||
}
|
||
|
||
// 把一ASCII码表示的串转化为正常串
|
||
// "414331" -> "AC1"
|
||
int UnHexString( char *szHexBuf, char *szBuf)
|
||
{
|
||
int nLen=(int)strlen(szHexBuf);
|
||
if((nLen%2)!=0)
|
||
return FALSE;
|
||
//int k=0;
|
||
int i = 0;
|
||
for(i=0; i<nLen/2; i++) {
|
||
char szChar[3]="";
|
||
szChar[0]=szHexBuf[i*2];
|
||
szChar[1]=szHexBuf[i*2+1];
|
||
szChar[2]=0;
|
||
int nn;
|
||
strlwr(szChar);
|
||
sscanf(szChar, "%x", &nn);
|
||
szBuf[i] = nn;
|
||
}
|
||
szBuf[i]=0;
|
||
return TRUE;
|
||
}
|
||
|
||
void ProtectDwg()
|
||
{
|
||
PickSet ss(SS_FREE);
|
||
PickSet ssTch(SS_FREE);
|
||
|
||
TCHAR szYes[256];
|
||
int ret = ads_getstring(0, _T("\n慎重,加密前请备份。该命令会分解上华对象,且无法还原,是否继续<N>:"), szYes);
|
||
if(_tcsicmp(szYes, _T("Y")) != 0)
|
||
return;
|
||
if(SelectEntities(_T("\n请选择范围<退出>"), ss, RBList()) != RTNORM)
|
||
return;
|
||
RBList mask(RTDXF0, _T("TCH_*"), NULL);
|
||
XPushVarStr clayer(_T("LAYER"), _T("0"));
|
||
|
||
|
||
// 第一步, 分解块表中上华对象
|
||
AcDbDatabase *pCurDwg = acdbCurDwg();
|
||
AcDbBlockTable *pNewBlockTab=NULL;
|
||
VERIFY(pCurDwg->getSymbolTable(pNewBlockTab, AcDb::kForRead)==Acad::eOk);
|
||
ASSERT(pNewBlockTab);
|
||
AcDbBlockTableIterator *pIterator=NULL;
|
||
Acad::ErrorStatus es1=pNewBlockTab->newIterator(pIterator);
|
||
pNewBlockTab->close();
|
||
XPushMemVar<BOOL> vTemp1(XExplodeStream::m_bExportTch4, TRUE);
|
||
XPushMemVar<BOOL> vTemp(XExplodeStream::m_bFullExplode, TRUE);
|
||
if(es1==Acad::eOk && pIterator) {
|
||
for(pIterator->start(); !pIterator->done(); pIterator->step()) {
|
||
AcDbBlockTableRecord *pRec=NULL;
|
||
if(pIterator->getRecord(pRec, AcDb::kForWrite)==Acad::eOk && pRec) {
|
||
if(pRec->isFromExternalReference()) {
|
||
} else {
|
||
const TCHAR *rName=NULL;
|
||
pRec->getName(rName);
|
||
BOOL bMspace=(_tcsicmp(rName, ACDB_MODEL_SPACE)==0);
|
||
if(!bMspace) { //分解图块中的对象
|
||
ExplodeWithinBlock(pRec, FALSE);
|
||
}
|
||
}
|
||
pRec->close();
|
||
}
|
||
}
|
||
delete pIterator;
|
||
}
|
||
|
||
|
||
|
||
// 第二步, 创建1个空的匿名块
|
||
AcDbBlockTableRecord *pMspace=new AcDbBlockTableRecord;
|
||
pMspace->setName(_T("*U"));
|
||
AcDbObjectId idTempBlock=AddBlock(pMspace, FALSE);
|
||
pMspace->close();
|
||
|
||
acedSetStatusBarProgressMeter(_T("分解中..."), 0, ss.Length());
|
||
|
||
// 第三步, 分解本图中上华对象,并把所有需要保护的图元deepClone到匿名块记录中
|
||
for(long i=0; i<ss.Length(); i++) {
|
||
acedSetStatusBarProgressMeterPos(i);
|
||
AcDbIdMapping pIdMap;
|
||
AcDbObjectIdArray ArrayID;
|
||
Entity ent = ss[i];
|
||
if(ent.Is(_T("ATS_EQUIPDIM")) || ent.Is(_T("ATS_WIREDIM")) || ent.Is(_T("ATS_WIREDIM2"))){
|
||
AcDbVoidPtrArray entitySet;
|
||
XDbObject obj(ent, AcDb::kForRead);
|
||
if(!obj) continue;
|
||
((AcDbEntity *)obj.m_pObject)->explode(entitySet);
|
||
int nCount=entitySet.length();
|
||
for(int j=0; j<nCount; j++) {
|
||
AcDbEntity *pEnt=(AcDbEntity *)entitySet[j];
|
||
AcDbObjectId idNew = AddToCurrentSpace(pEnt, Adesk::kTrue);
|
||
ArrayID.append(idNew);
|
||
ssTch+=idNew;
|
||
}
|
||
}
|
||
else if(!!ent.MatchBase(mask)){
|
||
XDbObject obj(ent, AcDb::kForRead);
|
||
if(!obj) continue;
|
||
AcDbVoidPtrArray entitySet;
|
||
XExplodeStream dc(entitySet);
|
||
dc.SetPropertiesFrom((const AcDbEntity *)obj.m_pObject);
|
||
((TDbEntity *)obj.m_pObject)->ExplodeOrDraw2d(dc);
|
||
int nCount=entitySet.length();
|
||
for(int j=0; j<nCount; j++) {
|
||
AcDbEntity *pEnt=(AcDbEntity *)entitySet[j];
|
||
AcDbObjectId idNew = AddToCurrentSpace(pEnt, Adesk::kTrue);
|
||
ArrayID.append(idNew);
|
||
ssTch+=idNew;
|
||
}
|
||
}
|
||
else{
|
||
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt);
|
||
if(pEnt) {
|
||
AcDbObjectId id = pEnt->objectId();
|
||
ArrayID.append(id);
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
Acad::ErrorStatus es = acdbCurDwg()->deepCloneObjects(ArrayID,idTempBlock,pIdMap);
|
||
if(Acad::eOk!=es && Acad::eIllegalEntityType!=es){
|
||
acedRestoreStatusBar();
|
||
return;
|
||
// 2009-3-19增加eIllegalEntityType,由匿名块组成的组,无法成功deepCloneObjects,但不影响结果
|
||
}
|
||
}
|
||
acedRestoreStatusBar();
|
||
// 第四步, 创建一个MInsert块参考,并把密码放到其扩展数据中
|
||
AcGePoint3d pt;
|
||
AcDbMInsertBlock *pNewBlk = new AcDbMInsertBlock;
|
||
pNewBlk->setBlockTableRecord(idTempBlock);
|
||
pNewBlk->setPosition(pt);
|
||
pNewBlk->setLayer(_T("0"));
|
||
pNewBlk->setRotation(0);
|
||
pNewBlk->setColumns(1);
|
||
pNewBlk->setRows(2);
|
||
pNewBlk->setColumnSpacing(0);
|
||
pNewBlk->setRowSpacing(0);
|
||
|
||
pNewBlk->setScaleFactors(AcGeScale3d(1,1,1));
|
||
AddToCurrentSpace(pNewBlk, Adesk::kTrue);
|
||
ss.Erase();
|
||
ssTch.Erase();
|
||
|
||
TCHAR szPw[256]=_T("");
|
||
char szPwAsc[256]="", szPw2[256];
|
||
ads_getstring(0, _T("\n请输入密码<空>:"), szPw);
|
||
Entity entLast;
|
||
entLast.GetLast();
|
||
if(_tcsicmp(szPw, _T("")) != 0){
|
||
strcpy(szPw2, AString(szPw));
|
||
|
||
int datalen = (int)strlen(szPw2);
|
||
HexString(szPw2, datalen, szPwAsc);
|
||
}
|
||
WriteXdata(entLast, _T("TG_PASSWORD"), TString(szPwAsc));
|
||
|
||
}
|
||
|
||
void UnlockProtectDwg()
|
||
{
|
||
RBList mask(RTDXF0, _T("INSERT"), NULL);
|
||
|
||
Entity ent;
|
||
if(SelectEntity(_T("\n请选择对象<退出>"), ent, mask) != RTNORM)
|
||
return;
|
||
CString csPw;
|
||
csPw = ReadXdata(ent, _T("TG_PASSWORD"));
|
||
TCHAR szPw[256];
|
||
ads_getstring(0, _T("\n请输入密码:"), szPw);
|
||
if(_tcscmp(csPw, szPw) != 0){
|
||
char szPw2[256], szPwAsc[256];
|
||
strcpy(szPwAsc, AString(csPw));
|
||
UnHexString(szPwAsc, szPw2);
|
||
if(_tcscmp(TString(szPw2), szPw) != 0){
|
||
adsout << _T("\n密码错误,无法解锁!");
|
||
return;
|
||
}
|
||
}
|
||
|
||
|
||
AcDbVoidPtrArray entitySet;
|
||
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbMInsertBlock , pEnt);
|
||
if(pEnt) {
|
||
AcDbBlockReference *pEnt2 = new AcDbBlockReference;
|
||
pEnt2->copyFrom(pEnt);
|
||
AcDbObjectId idNew = AddToCurrentSpace(pEnt2, Adesk::kTrue);
|
||
}
|
||
OPENOBJ_END();
|
||
int len = entitySet.length();
|
||
Entity entLast;
|
||
entLast.GetLast();
|
||
ads_command(RTSTR, _T("explode"), RTENAME, (TLong_ptr*)entLast, RTNONE);
|
||
ent.Erase();
|
||
|
||
}
|
||
|
||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
// 虚实变换
|
||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
||
void Continue2Dash()
|
||
{
|
||
PickSet ss(SS_FREE);
|
||
if(SelectEntities(_T("\n请选择要变换的图元<退出>"), ss, RBList()) != RTNORM)
|
||
return;
|
||
int iNum = 1;
|
||
CString csLineType = _T("DASH");
|
||
BOOL flag = FALSE;
|
||
Entity ent1 = ss[0L];
|
||
AcDbObjectId eId1;
|
||
AcDbEntity *pEnt1 = NULL;
|
||
acdbGetObjectId(eId1, ent1);
|
||
acdbOpenObject(pEnt1, eId1, AcDb::kForRead);
|
||
if(pEnt1){
|
||
TCHAR *linetype1;
|
||
linetype1 = pEnt1->linetype();
|
||
if(_tcsicmp(linetype1, _T("ByLayer")) == 0 || _tcsicmp(linetype1, _T("CONTINUES")) == 0
|
||
|| _tcsicmp(linetype1, _T("CONTINUOUS")) == 0 || _tcsicmp(linetype1, _T("ByBlock")) == 0){
|
||
flag = TRUE;
|
||
}
|
||
delete [] linetype1;
|
||
pEnt1->close();
|
||
}
|
||
|
||
if(flag){
|
||
ads_getint(_T("\n请输入线型{1:虚线 2:点划线 3:双点划线 4:三点划线}<虚线>"), &iNum);
|
||
if(iNum == 2)
|
||
csLineType = _T("CENTER2");
|
||
else if(iNum == 3)
|
||
csLineType = _T("PHANTOM2");
|
||
else if(iNum == 4)
|
||
csLineType = _T("PHANTOM3");
|
||
}
|
||
long len = ss.Length();
|
||
for(long i=0;i<len;i++){
|
||
Entity ent = ss[i];
|
||
AcDbObjectId eId;
|
||
AcDbEntity *pEnt = NULL;
|
||
acdbGetObjectId(eId, ent);
|
||
acdbOpenObject(pEnt, eId, AcDb::kForWrite);
|
||
if(pEnt){
|
||
TCHAR *linetype;
|
||
linetype = pEnt->linetype();
|
||
if((_tcsicmp(linetype, _T("ByLayer")) == 0
|
||
|| _tcsicmp(linetype, _T("CONTINUES")) == 0
|
||
|| _tcsicmp(linetype, _T("CONTINUOUS")) == 0 ||
|
||
_tcsicmp(linetype, _T("ByBlock")) == 0 ) && AddLineType((const TCHAR*)csLineType)){
|
||
pEnt->setLinetype(csLineType);
|
||
pEnt->setLinetypeScale(1);
|
||
}
|
||
else if(_tcsicmp(linetype, _T("DASH")) == 0
|
||
|| _tcsicmp(linetype, _T("CENTER2")) == 0
|
||
|| _tcsicmp(linetype, _T("PHANTOM3")) == 0
|
||
|| _tcsicmp(linetype, _T("PHANTOM2")) == 0)
|
||
pEnt->setLinetype(_T("ByLayer"));
|
||
delete [] linetype;
|
||
pEnt->close();
|
||
}
|
||
}
|
||
}
|
||
|
||
//**************************************************************************
|
||
// 修正线形
|
||
//**************************************************************************
|
||
void ReviseLineType()
|
||
{
|
||
Entity ent;
|
||
if(SelectEntity(_T("\n请选择要修正线形的任意图元<退出>:"), ent, RBList()) != RTNORM)
|
||
return;
|
||
CString csLineType;
|
||
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt);
|
||
if(pEnt) {
|
||
TCHAR *linetype1;
|
||
linetype1 = pEnt->linetype();
|
||
csLineType = linetype1;
|
||
delete [] linetype1;
|
||
}
|
||
OPENOBJ_END();
|
||
// cet 2017.9.13 add 支持ucs,原代码旋转角度大时会出错
|
||
double dViewRotateAngle = 0.0;
|
||
xg_getvar(_T("VIEWTWIST"), &dViewRotateAngle);
|
||
bool bUcsView = false;
|
||
if (fabs(dViewRotateAngle) > 0.001)
|
||
{
|
||
bUcsView = true;
|
||
}
|
||
RBList mask(RTDXF0, _T("LWPOLYLINE,LINE,ATS_PIPE"), 6, csLineType, NULL);
|
||
PickSet ss(SS_FREE);
|
||
ss.Get(_T("X"), NULL, NULL, mask);
|
||
long len = ss.Length();
|
||
for(long i=0;i<len;i++){
|
||
Entity entTmp = ss[i];
|
||
if(entTmp.Is(_T("LINE"))){
|
||
XLine line(entTmp);
|
||
double nAng = line.Direction();
|
||
nAng = bUcsView ? Wcs2Ucs(nAng) : nAng; // cet 2017.9.13 add 支持ucs
|
||
if(nAng > PI/2 && nAng < (PI/2*3 + 0.001)){
|
||
line.Reverse();
|
||
line.Modify(&entTmp);
|
||
}
|
||
}
|
||
else if(entTmp.Is(_T("ATS_PIPE"))){
|
||
XPoint ptStart, ptEnd;
|
||
OPENOBJ_BEGIN(entTmp, AcDb::kForWrite, TDbPipe, pPipe);
|
||
if(pPipe) {
|
||
ptStart = pPipe->StartPoint();
|
||
ptEnd = pPipe->EndPoint();
|
||
ptStart.z = 0;
|
||
ptEnd.z = 0;
|
||
double nAng = ads_angle(ptStart, ptEnd);
|
||
nAng = bUcsView ? Wcs2Ucs(nAng) : nAng; // cet 2017.9.13 add 支持ucs
|
||
if(nAng > PI/2 && nAng < (PI/2*3 + 0.001)){
|
||
pPipe->Reverse();
|
||
}
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
else if(entTmp.Is(_T("LWPOLYLINE"))){//多段PLINE线, 包含圆弧的PLINE 都不考虑
|
||
XPoly2D poly(entTmp);
|
||
if(poly.Length() > 2)
|
||
continue;
|
||
if(poly.HasArcSegment())
|
||
continue;
|
||
XPoint ptStart, ptEnd;
|
||
ptStart = *poly[0];
|
||
ptEnd = *poly[1];
|
||
ptStart.z = 0;
|
||
ptEnd.z = 0;
|
||
double nAng = ads_angle(ptStart, ptEnd);
|
||
nAng = bUcsView ? Wcs2Ucs(nAng) : nAng; // cet 2017.9.13 add 支持ucs
|
||
if(nAng > PI/2 && nAng < (PI/2*3 + 0.001)){
|
||
OPENOBJ_BEGIN(entTmp, AcDb::kForWrite, AcDbPolyline, pPline);
|
||
if(pPline) {
|
||
pPline->setPointAt(0, *poly[1]);
|
||
pPline->setPointAt(1, *poly[0]);
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
//**************************************************************************
|
||
// 线形比例
|
||
//**************************************************************************
|
||
void SetDashLine()
|
||
{
|
||
PickSet ss(SS_FREE);
|
||
|
||
if(SelectEntities(_T("\n请选择需要设置比例的线<整图修改>:"), ss, RBList()) != RTNORM)
|
||
{
|
||
Entity entSel;
|
||
if(SelectEntity(_T("\n请选择需要设置比例的参考线>:"), entSel, RBList()) != RTNORM)
|
||
return;
|
||
TCHAR szLinetype[256]=_T("");
|
||
entSel.GetData(6, szLinetype);
|
||
RBList rbMask(RTDXF0, _T("*"), 6, szLinetype, NULL);
|
||
ss.Get(_T("X"), NULL, NULL, rbMask);
|
||
}
|
||
double nNum = 1;
|
||
ads_getreal(_T("\n请输入线型比例 <1>"), &nNum);
|
||
|
||
long len = ss.Length();
|
||
for(long i=0;i<len;i++){
|
||
Entity ent = ss[i];
|
||
AcDbObjectId eId;
|
||
AcDbEntity *pEnt = NULL;
|
||
acdbGetObjectId(eId, ent);
|
||
acdbOpenObject(pEnt, eId, AcDb::kForWrite);
|
||
if(!pEnt)
|
||
return;
|
||
pEnt->setLinetypeScale(nNum);
|
||
pEnt->close();
|
||
}
|
||
return;
|
||
}
|
||
|
||
//**************************************************************************
|
||
// 上华拷贝
|
||
//**************************************************************************
|
||
//extern GEOAPI void CapturePoint(const ads_point ptBase, const ads_point ptDest,ads_point ptCapture);
|
||
//static XPoint g_ptBase; // UCS
|
||
|
||
|
||
static int MoveSampler(ads_point pt0, ads_matrix mat)
|
||
{
|
||
// Move操作时,没有基点,正交不起作用
|
||
XPoint pt;
|
||
pt=Ucs2Wcs(pt);
|
||
CapturePoint(NULL, pt0, pt); //使得正交(Ortho)和捕捉(SNAP)起作用
|
||
pt = Ucs2Wcs(pt);
|
||
Ucs2Wcs(g_ptBase).GetMoveMatrix(pt, mat);
|
||
return RTNORM;
|
||
}
|
||
|
||
/*
|
||
class TAdvanceSampler {
|
||
public:
|
||
static XPoint g_ptLastTemp;
|
||
static XPoint g_ptBase;
|
||
static int g_nCtrlFlag; // 0--Disable Drag Line; 1--Enable Drag Line
|
||
static double g_nDirection;
|
||
|
||
static int MoveSampler(ads_point pt0, ads_matrix mat);
|
||
static void Init(XPoint ptBase, int nFlag);
|
||
};
|
||
|
||
XPoint TAdvanceSampler::g_ptLastTemp;
|
||
XPoint TAdvanceSampler::g_ptBase;
|
||
int TAdvanceSampler::g_nCtrlFlag=0;
|
||
//double TAdvanceSampler::g_nDirection=0.0;
|
||
|
||
void TAdvanceSampler::Init(XPoint ptBase, int nFlag)
|
||
{
|
||
g_ptBase=g_ptLastTemp=ptBase;
|
||
g_nCtrlFlag=nFlag;
|
||
g_nDirection=0.0;
|
||
}
|
||
|
||
// According to pt0, Modify mat
|
||
int TAdvanceSampler::MoveSampler(ads_point pt0, ads_matrix mat)
|
||
{
|
||
// Move操作时,没有基点,正交不起作用
|
||
XPoint pt;
|
||
//pt=Ucs2Wcs(pt);
|
||
if(g_nCtrlFlag) {
|
||
CapturePoint(g_ptBase, pt0, pt); //使得正交(Ortho)和捕捉(SNAP)起作用
|
||
} else {
|
||
CapturePoint(NULL, pt0, pt); //使得正交(Ortho)和捕捉(SNAP)起作用
|
||
}
|
||
|
||
|
||
if(g_nCtrlFlag) {
|
||
XScreenDc dc(-1);
|
||
dc << XLine(g_ptBase, g_ptLastTemp);
|
||
dc << XLine(g_ptBase, pt);
|
||
g_ptLastTemp=pt;
|
||
}
|
||
g_nDirection=ads_angle(g_ptBase, pt);
|
||
|
||
pt = Ucs2Wcs(pt);
|
||
Ucs2Wcs(g_ptBase).GetMoveMatrix(pt, mat);
|
||
return RTNORM;
|
||
}
|
||
*/
|
||
|
||
// ptBase==UCS
|
||
// 用于带橡皮筋的复制
|
||
int DragPickSet2(PickSet &ss, XPoint &ptBase)
|
||
{
|
||
int rc;
|
||
TCHAR draggenprompt[512]=_T("");
|
||
const TCHAR *szPrompt=_T("\n点取位置或 [转90度(A)/左右翻(S)/上下翻(D)/对齐(F)/改转角(R)/改基点(T)]<退出>:");
|
||
int cur=0;
|
||
XPoint ptFinal;
|
||
TAdvanceSampler samp;
|
||
samp.Init(ptBase, 1);
|
||
XPoint pp = samp.g_ptBase;
|
||
|
||
cur = 0;
|
||
//g_ptBase=ptBase;
|
||
adsout << szPrompt;
|
||
LAB_DRAG:
|
||
ss.Redraw(2);
|
||
INITGET_BEG(RSG_OTHER, _T("A S D F R T"));
|
||
rc = ads_draggen(ss,
|
||
draggenprompt,
|
||
cur,
|
||
TAdvanceSampler::MoveSampler,
|
||
ptFinal);
|
||
INITGET_END();
|
||
ptFinal.z = ptBase.z;
|
||
XScreenDc dc(-1);
|
||
dc << XLine(samp.g_ptBase, samp.g_ptLastTemp);
|
||
|
||
if(rc==RTKWORD) {
|
||
XString sKeyChar;
|
||
VERIFY(ads_getinput(sKeyChar)==RTNORM);
|
||
/*
|
||
XPoint g_ptNewBase=GetCursorWcs();
|
||
XPoint vtMove=g_ptNewBase-Ucs2Wcs(samp.g_ptBase);
|
||
ads_matrix mat={{1.0, 0.0, 0.0, vtMove.x},
|
||
{0.0, 1.0, 0.0, vtMove.y},
|
||
{0.0, 0.0, 1.0, vtMove.z},
|
||
{0.0, 0.0, 0.0, 1.0}};
|
||
VERIFY(ads_xformss(ss, mat)==RTNORM);
|
||
samp.g_ptBase=Wcs2Ucs(g_ptNewBase);
|
||
*/
|
||
ads_printf(_T("%c%c %c"), 8,8,8);
|
||
|
||
if(sKeyChar[0]==_T('A') || sKeyChar[0]==_T('S') || sKeyChar[0]==_T('D')) {
|
||
XPushVar<int> nMode(_T("OSMODE"), 0);
|
||
//ads_matrix mat;
|
||
if(sKeyChar[0]==_T('S')) {
|
||
XPoint ptOther=samp.g_ptBase+XPoint(0,100,0);
|
||
ads_command(RTSTR, _T(".MIRROR"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""),
|
||
RT3DPOINT, &samp.g_ptBase, RT3DPOINT, &ptOther, RTSTR, _T("Y"), NULL);
|
||
} else if(sKeyChar[0]==_T('D')) {
|
||
XPoint ptOther=samp.g_ptBase+XPoint(100,0,0);
|
||
ads_command(RTSTR, _T(".MIRROR"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""),
|
||
RT3DPOINT, &samp.g_ptBase, RT3DPOINT, &ptOther, RTSTR, _T("Y"), NULL);
|
||
} else if(sKeyChar[0]==_T('A')) {
|
||
ads_command(RTSTR, _T(".ROTATE"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""),
|
||
RT3DPOINT, &samp.g_ptBase, RTREAL, 90.0, NULL);
|
||
}
|
||
rc=RTNORM;
|
||
} else if(sKeyChar[0]==_T('F')) {
|
||
int nOsMode=0;
|
||
xg_getvar(_T("OSMODE"), &nOsMode);
|
||
nOsMode &= ~0x4000;
|
||
nOsMode |= OS_INT|OS_NEA|OS_PER|OS_END|OS_MID|OS_CEN;
|
||
XPushVar<int> vOsMode(_T("OSMODE"), nOsMode);
|
||
XPoint pt1=samp.g_ptBase, pt2, qt1, qt2;
|
||
if(ads_getpoint(NULL, _T("\n对齐参考点:"), pt1)==RTNORM &&
|
||
ads_getpoint(pt1, _T("\n对齐参考轴:"), pt2)==RTNORM &&
|
||
ads_getpoint(NULL, _T("\n对齐目标点:"), qt1)==RTNORM &&
|
||
ads_getpoint(qt1, _T("\n对齐目标轴:"), qt2)==RTNORM) {
|
||
XPushVar<int> osmode(_T("OSMODE"), 0);
|
||
double nRot=CT_std_angle(ads_angle(qt1, qt2)-ads_angle(pt1, pt2));
|
||
ads_command(RTSTR, _T(".MOVE"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""),
|
||
RT3DPOINT, &pt1, RT3DPOINT, &qt1, NULL);
|
||
ads_command(RTSTR, _T(".ROTATE"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""),
|
||
RT3DPOINT, &qt1, RTREAL, nRot*180/PI, NULL);
|
||
rc=RTNORM;
|
||
return rc;
|
||
}
|
||
rc=RTNORM;
|
||
} else if(sKeyChar[0]==_T('R')) {
|
||
double nRot=0.0;
|
||
adsout << _T("\n旋转角度: ");
|
||
rc=ads_command(RTSTR, _T(".ROTATE"), RTPICKS, (TLong_ptr *)ss,
|
||
RTSTR, _T(""), RT3DPOINT, &samp.g_ptBase, RTSTR, _T("\\"), NULL); //ss.Rotate(g_ptBase, &nRot);
|
||
if(rc==RTNORM)
|
||
adsout << szPrompt;
|
||
} else if(sKeyChar[0]==_T('T')) {
|
||
ss.Redraw(1);
|
||
|
||
int nOsMode=0;
|
||
xg_getvar(_T("OSMODE"), &nOsMode);
|
||
nOsMode &= ~0x4000;
|
||
nOsMode |= OS_INT|OS_NEA|OS_PER|OS_END|OS_MID|OS_CEN;
|
||
XPushVar<int> vOsMode(_T("OSMODE"), nOsMode);
|
||
rc=XGetPoint(NULL, _T("\n输入插入点"), samp.g_ptBase);
|
||
if(rc==RTNORM) {
|
||
adsout << szPrompt;
|
||
ptBase=samp.g_ptBase;
|
||
}
|
||
}
|
||
if(rc==RTNORM) {
|
||
samp.g_ptLastTemp=samp.g_ptBase;
|
||
goto LAB_DRAG;
|
||
}
|
||
}
|
||
ptBase=samp.g_ptBase;
|
||
|
||
|
||
switch (rc) {
|
||
case RTSTR:
|
||
case RTNORM: {
|
||
if(rc==RTSTR) {
|
||
XString str;
|
||
ads_getinput(str);
|
||
ads_polar(samp.g_ptBase, samp.g_nDirection, _tstof(str), ptFinal);
|
||
} else {
|
||
CapturePoint(samp.g_ptBase, XPoint(ptFinal), ptFinal);
|
||
}
|
||
ptFinal=Ucs2Wcs(ptFinal);
|
||
XPoint vtMove=ptFinal-Ucs2Wcs(samp.g_ptBase);
|
||
ads_matrix mat={{1.0, 0.0, 0.0, vtMove.x},
|
||
{0.0, 1.0, 0.0, vtMove.y},
|
||
{0.0, 0.0, 1.0, vtMove.z},
|
||
{0.0, 0.0, 0.0, 1.0}};
|
||
|
||
VERIFY(ads_xformss(ss, mat)==RTNORM);
|
||
XPoint pt0=Ucs2Wcs(ptBase);
|
||
ptBase=pt0.TransformAs(mat);
|
||
ptBase=Wcs2Ucs(ptBase);
|
||
rc=RTNORM;
|
||
}
|
||
break;
|
||
case RTCAN:
|
||
case RTNONE:
|
||
case RTERROR:
|
||
break;
|
||
}
|
||
ss.Redraw(1);
|
||
//actrTransactionManager->flushGraphics();
|
||
//acedUpdateDisplay();
|
||
|
||
return rc;
|
||
}
|
||
|
||
|
||
/*
|
||
int DragPickSet2(PickSet &ss, XPoint &ptBase)
|
||
{
|
||
int rc;
|
||
TCHAR draggenprompt[512]=_T("");
|
||
const TCHAR *szPrompt=_T("\n点取位置或 [转90度(A)/左右翻(S)/上下翻(D)/对齐(F)/改转角(R)/改基点(T)]<退出>:");
|
||
int cur=0;
|
||
XPoint ptFinal;
|
||
// TAdvanceSampler samp;
|
||
// samp.Init(ptBase, 1);
|
||
|
||
cur = 0;
|
||
//g_ptBase=ptBase;
|
||
adsout << szPrompt;
|
||
LAB_DRAG:
|
||
ss.Redraw(2);
|
||
INITGET_BEG(RSG_OTHER, _T("A S D F R T"));
|
||
rc = ads_draggen(ss,
|
||
draggenprompt,
|
||
cur,
|
||
MoveSampler,
|
||
ptFinal);
|
||
INITGET_END();
|
||
// XScreenDc dc(-1);
|
||
// dc << XLine(samp.g_ptBase, samp.g_ptLastTemp);
|
||
|
||
if(rc==RTKWORD) {
|
||
XString sKeyChar;
|
||
VERIFY(ads_getinput(sKeyChar)==RTNORM);
|
||
|
||
ads_printf(_T("%c%c %c"), 8,8,8);
|
||
|
||
if(sKeyChar[0]==_T('A') || sKeyChar[0]==_T('S') || sKeyChar[0]==_T('D')) {
|
||
XPushVar<int> nMode(_T("OSMODE"), 0);
|
||
//ads_matrix mat;
|
||
if(sKeyChar[0]==_T('S')) {
|
||
XPoint ptOther=g_ptBase+XPoint(0,100,0);
|
||
ads_command(RTSTR, _T(".MIRROR"), RTPICKS, (long *)ss, RTSTR, _T(""),
|
||
RT3DPOINT, &g_ptBase, RT3DPOINT, &ptOther, RTSTR, _T("Y"), NULL);
|
||
} else if(sKeyChar[0]==_T('D')) {
|
||
XPoint ptOther=g_ptBase+XPoint(100,0,0);
|
||
ads_command(RTSTR, _T(".MIRROR"), RTPICKS, (long *)ss, RTSTR, _T(""),
|
||
RT3DPOINT, &g_ptBase, RT3DPOINT, &ptOther, RTSTR, _T("Y"), NULL);
|
||
} else if(sKeyChar[0]==_T('A')) {
|
||
ads_command(RTSTR, _T(".ROTATE"), RTPICKS, (long *)ss, RTSTR, _T(""),
|
||
RT3DPOINT, &g_ptBase, RTREAL, 90.0, NULL);
|
||
}
|
||
rc=RTNORM;
|
||
} else if(sKeyChar[0]==_T('F')) {
|
||
int nOsMode=0;
|
||
xg_getvar(_T("OSMODE"), &nOsMode);
|
||
nOsMode &= ~0x4000;
|
||
nOsMode |= OS_INT|OS_NEA|OS_PER|OS_END|OS_MID|OS_CEN;
|
||
XPushVar<int> vOsMode(_T("OSMODE"), nOsMode);
|
||
XPoint pt1=g_ptBase, pt2, qt1, qt2;
|
||
if(ads_getpoint(NULL, _T("\n对齐参考点:"), pt1)==RTNORM &&
|
||
ads_getpoint(pt1, _T("\n对齐参考轴:"), pt2)==RTNORM &&
|
||
ads_getpoint(NULL, _T("\n对齐目标点:"), qt1)==RTNORM &&
|
||
ads_getpoint(qt1, _T("\n对齐目标轴:"), qt2)==RTNORM) {
|
||
XPushVar<int> osmode(_T("OSMODE"), 0);
|
||
double nRot=CT_std_angle(ads_angle(qt1, qt2)-ads_angle(pt1, pt2));
|
||
ads_command(RTSTR, _T(".MOVE"), RTPICKS, (long *)ss, RTSTR, _T(""),
|
||
RT3DPOINT, &pt1, RT3DPOINT, &qt1, NULL);
|
||
ads_command(RTSTR, _T(".ROTATE"), RTPICKS, (long *)ss, RTSTR, _T(""),
|
||
RT3DPOINT, &qt1, RTREAL, nRot*180/PI, NULL);
|
||
rc=RTNORM;
|
||
return rc;
|
||
}
|
||
rc=RTNORM;
|
||
} else if(sKeyChar[0]==_T('R')) {
|
||
double nRot=0.0;
|
||
adsout << _T("\n旋转角度: ");
|
||
rc=ads_command(RTSTR, _T(".ROTATE"), RTPICKS, (long *)ss,
|
||
RTSTR, _T(""), RT3DPOINT, &g_ptBase, RTSTR, _T("\\"), NULL); //ss.Rotate(g_ptBase, &nRot);
|
||
if(rc==RTNORM)
|
||
adsout << szPrompt;
|
||
} else if(sKeyChar[0]==_T('T')) {
|
||
ss.Redraw(1);
|
||
|
||
int nOsMode=0;
|
||
xg_getvar(_T("OSMODE"), &nOsMode);
|
||
nOsMode &= ~0x4000;
|
||
nOsMode |= OS_INT|OS_NEA|OS_PER|OS_END|OS_MID|OS_CEN;
|
||
XPushVar<int> vOsMode(_T("OSMODE"), nOsMode);
|
||
rc=XGetPoint(NULL, _T("\n输入插入点"), g_ptBase);
|
||
if(rc==RTNORM) {
|
||
adsout << szPrompt;
|
||
ptBase=g_ptBase;
|
||
}
|
||
}
|
||
if(rc==RTNORM) {
|
||
// g_ptLastTemp=g_ptBase;
|
||
goto LAB_DRAG;
|
||
}
|
||
}
|
||
ptBase=g_ptBase;
|
||
|
||
|
||
switch (rc) {
|
||
case RTSTR:
|
||
case RTNORM: {
|
||
if(rc==RTSTR) {
|
||
XString str;
|
||
ads_getinput(str);
|
||
ads_polar(g_ptBase, g_nDirection, _tstof(str), ptFinal);
|
||
} else {
|
||
CapturePoint(g_ptBase, XPoint(ptFinal), ptFinal);
|
||
}
|
||
ptFinal=Ucs2Wcs(ptFinal);
|
||
XPoint vtMove=ptFinal-Ucs2Wcs(g_ptBase);
|
||
ads_matrix mat={{1.0, 0.0, 0.0, vtMove.x},
|
||
{0.0, 1.0, 0.0, vtMove.y},
|
||
{0.0, 0.0, 1.0, vtMove.z},
|
||
{0.0, 0.0, 0.0, 1.0}};
|
||
|
||
VERIFY(ads_xformss(ss, mat)==RTNORM);
|
||
XPoint pt0=Ucs2Wcs(ptBase);
|
||
ptBase=pt0.TransformAs(mat);
|
||
ptBase=Wcs2Ucs(ptBase);
|
||
rc=RTNORM;
|
||
}
|
||
break;
|
||
case RTCAN:
|
||
case RTNONE:
|
||
case RTERROR:
|
||
break;
|
||
}
|
||
ss.Redraw(1);
|
||
//actrTransactionManager->flushGraphics();
|
||
//acedUpdateDisplay();
|
||
|
||
return rc;
|
||
}
|
||
*/
|
||
|
||
//extern void OpenDwgFile(void *pData);
|
||
//void TgDragCopy44()
|
||
//{
|
||
// CString csFileName1;
|
||
// CAcModuleResourceOverride vTemp;
|
||
// CFileDialog dlg(TRUE,_T("*.dwg"),csFileName1,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
|
||
// _T("Drawing(*.dwg) |*.dwg||"), acedGetAcadFrame());
|
||
// TCHAR strDlgTitle[] = _T("选择要比对的DWG文件");
|
||
// dlg.m_ofn.lpstrTitle = strDlgTitle;
|
||
// if(dlg.DoModal()!=IDOK)
|
||
// return;
|
||
//
|
||
// csFileName1 = dlg.GetPathName();
|
||
//
|
||
//
|
||
// static TContextOpen sContext;
|
||
// _tcscpy(sContext.szFileName, (const TCHAR *)csFileName1);
|
||
// sContext.bClose = TRUE;
|
||
//
|
||
//
|
||
// AcApDocument* pDoc = acDocManager->curDocument();
|
||
// if (pDoc)
|
||
// {
|
||
// acDocManager->lockDocument(pDoc);
|
||
// acDocManager->executeInApplicationContext(OpenDwgFile, (void *)&sContext);
|
||
// acDocManager->unlockDocument(pDoc);
|
||
// }
|
||
//
|
||
|
||
|
||
|
||
void TgDragCopy()
|
||
{
|
||
AcAxDocLock docLock;
|
||
PickSet ss(SS_FREE);
|
||
PickSet ssAll(SS_FREE);
|
||
VERIFY(docLock.lockStatus() == Acad::eOk);
|
||
{
|
||
XPushVarStr clayer(_T("USERS5"), _T("IGNORETGCPCMD"));
|
||
RBList mask(RTDXF0, _T("*"), NULL);
|
||
if(SelectEntities(_T("\n请选择要拷贝的对象: "), ss, mask)==RTNORM) {
|
||
ssAll+=ss;
|
||
XPoint ptLow, ptUp;
|
||
ss.GetExtend(ptLow, ptUp);
|
||
ptLow=Wcs2Ucs(ptLow);
|
||
ads_getpoint(ptLow, _T("\n请点选基点<左下角>:"), ptLow);
|
||
|
||
while(1) {
|
||
PickSet ss1(SS_FREE);
|
||
ss1.IncludeBegin();
|
||
{
|
||
XPushVar<int> tVar(_T("OSMODE"), 0);
|
||
ads_command(RTSTR, _T("_COPY"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""),
|
||
RTSTR, _T("0,0"), RTSTR, _T("0,0"), RTNONE);
|
||
}
|
||
ss1.IncludeEnd();
|
||
// ptLow.x += 1000;
|
||
// ptLow.y += 1000;
|
||
|
||
if(DragPickSet2(ss1, ptLow)!=RTNORM) {
|
||
ss1.Erase();
|
||
break;
|
||
} else {
|
||
ss.Free();
|
||
ss += ss1;
|
||
ssAll+=ss1;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
//如果上华拷贝含有电气桥架或风管,必须将新生成的对象重新更新关系
|
||
BOOL bHasPipebase = FALSE;
|
||
long len = ss.Length();
|
||
for(long i=0;i<len;i++)
|
||
{
|
||
Entity entTmp = ss[i];
|
||
if(entTmp.Is(_T("ATS_CABLETRY")) || entTmp.Is(_T("ATS_DBHVACDUCT"))) //2012-6-25 支持风管
|
||
{
|
||
bHasPipebase = TRUE;
|
||
}
|
||
}
|
||
if(!bHasPipebase)
|
||
return;
|
||
|
||
len = ssAll.Length();
|
||
CString csUser = _T("ur:");
|
||
for(i=0;i<len;i++)
|
||
{
|
||
Entity entTmp = ssAll[i];
|
||
OPENOBJ_BEGIN(entTmp, AcDb::kForRead, AcDbEntity, pEnt);
|
||
if(pEnt)
|
||
{
|
||
AcDbObjectId id = pEnt->objectId();
|
||
LONG_PTR iTmp = id.asOldId();
|
||
CString csTmp;
|
||
csTmp.Format(_T("%ld,"), iTmp);
|
||
csUser += csTmp;
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
xg_setvar(_T("USERS5"), csUser);
|
||
//把需要更新的id通过写入USERS5通知tch_pipebase, 那边处理完了后会自动清除
|
||
}
|
||
|
||
|
||
|
||
//**************************************************************************
|
||
// 字典检查
|
||
//**************************************************************************
|
||
|
||
//发现有很多图纸中带有垃圾字典ACAD_LAYERFILTERS,影响到上华【另存旧版】而且文件巨大。
|
||
//本命令目的删除这个字典。
|
||
//图层表-字典-ACAD_LAYERFILTERS-....
|
||
//找到字典,看看有没有ACAD_LAYERFILTERS,如果有_tremove它。
|
||
//因为还保留字典,所有没有执行pLayertable->releaseExtensionDictionary()
|
||
// 沈睿 2005-8-1
|
||
void CheckDictionary()
|
||
{
|
||
// tsjmodify 2010.6.17
|
||
CAcModuleResourceOverride vTemp;
|
||
|
||
AcApDocument* pDoc = acDocManager->curDocument();
|
||
CString sTitle;
|
||
if (pDoc != NULL)
|
||
{
|
||
sTitle = pDoc->fileName();
|
||
}
|
||
|
||
AcDbHostApplicationServices* pSvs = acdbHostApplicationServices();
|
||
AcDbDatabase* pDb = NULL;
|
||
if (pSvs != NULL)
|
||
{
|
||
pDb = pSvs->workingDatabase();
|
||
}
|
||
|
||
CDictionaryViewerDlg dicDlg(pDb, sTitle, acedGetAcadDwgView());
|
||
dicDlg.DoModal();
|
||
|
||
/*
|
||
AcDbLayerTable *pLayertable = NULL;
|
||
acdbCurDwg()->getLayerTable(pLayertable, AcDb::kForRead);
|
||
if(!pLayertable)
|
||
return;
|
||
AcDbObjectId idExtDict=pLayertable->extensionDictionary();
|
||
if(!!idExtDict) {
|
||
OPENOBJ_BEGIN(idExtDict, AcDb::kForWrite, AcDbDictionary, pDict);
|
||
if(pDict) {
|
||
if(pDict->has(_T("ACAD_LAYERFILTERS"))){
|
||
adsout<<_T("已经成功删除多余扩展字典:ACAD_LAYERFILTERS!\n");
|
||
pDict->remove(_T("ACAD_LAYERFILTERS"));
|
||
}
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
pLayertable->close();
|
||
|
||
TCHAR szDict[256];
|
||
ads_getstring(0, _T("\n请输入要删除的字典名:"), szDict);
|
||
if(_tcsicmp(szDict, _T("")) == 0)
|
||
return;
|
||
|
||
Acad::ErrorStatus es=Acad::eOk;
|
||
|
||
AcDbDatabase *pDb = curDoc()->database();
|
||
if(pDb==NULL)
|
||
return;
|
||
AcDbDictionary* pRootDict=NULL;
|
||
es=pDb->getNamedObjectsDictionary(pRootDict,AcDb::kForWrite);
|
||
assert(es==Acad::eOk);
|
||
if(pRootDict->has(szDict))
|
||
{
|
||
pRootDict->remove(szDict);
|
||
}
|
||
pRootDict->close();
|
||
|
||
*/
|
||
}
|
||
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
// 设置轴号
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
void SetOldDrawingIndex()
|
||
{
|
||
BOOL bFlag = DocGetOldDrawingIndex();
|
||
DocSetOldDrawingIndex(!bFlag);
|
||
}
|
||
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
// 打印检查
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
void CheckPlot()
|
||
{
|
||
PickSet ssAll(SS_FREE);
|
||
RBList mask(RTDXF0, _T("TCH_*"), NULL);
|
||
ssAll.Get(_T("X"), NULL, NULL, mask);
|
||
long len = ssAll.Length();
|
||
for(long i=0;i<len;i++){
|
||
Entity ent = ssAll[i];
|
||
|
||
AcDbObjectId eId;
|
||
AcDbEntity *pEnt = NULL;
|
||
acdbGetObjectId(eId, ent);
|
||
acdbOpenObject(pEnt, eId, AcDb::kForRead);
|
||
if(pEnt){
|
||
int iColor = pEnt->colorIndex();
|
||
if(iColor == 0){
|
||
if(pEnt->upgradeOpen()==Acad::eOk) {
|
||
pEnt->setColorIndex(256);
|
||
pEnt->downgradeOpen();
|
||
}
|
||
}
|
||
pEnt->close();
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
|
||
//***************************************************************************************************
|
||
// 修改加密方式
|
||
//***************************************************************************************************
|
||
void SetTgMode()
|
||
{
|
||
TCHAR szText[256];
|
||
int mode = 0;
|
||
|
||
CRegProperty regProp(GetRegLocation(), _T("License"));
|
||
regProp.SetTopRootKey(HKEY_LOCAL_MACHINE);
|
||
|
||
regProp.GetValue(_T("Mode"), mode);
|
||
if(mode == 0)
|
||
mode = 3;
|
||
|
||
_tcscpy(szText, XString(_T("%d"), mode));
|
||
CString csPrompt;
|
||
csPrompt.Format(_T("\n请选择上华软件运行模式[单机版(1)/网络版(2)/试用版(3)]<%d>:"), mode);
|
||
int result = ads_getstring(NULL, csPrompt, szText);
|
||
if(result != RTNORM)
|
||
return;
|
||
int ret = _ttoi(szText);
|
||
if(ret < 1 || ret > 3)
|
||
return;
|
||
if(ret == 3)
|
||
ret = 0;
|
||
regProp.SetValue(_T("Mode"), ret);
|
||
}
|
||
|
||
|
||
//***************************************************************************************************
|
||
// 上华抓屏
|
||
//***************************************************************************************************
|
||
GEOAPI int SaveBitmapToFile(HBITMAP hBitmap,LPTSTR lpFileName); //hBitmap 为刚才的屏幕位图句柄 lpFileName 为位图文件名
|
||
|
||
//#ifdef _WIN64
|
||
//#include "ximage.h"
|
||
// extern int WriteJpeg( FILE * input_file, FILE * output_file);
|
||
extern int g_iSrcImgType;
|
||
//#else
|
||
// extern int WriteJpeg( FILE * input_file, FILE * output_file);
|
||
//#endif
|
||
|
||
BOOL g_bTracking = FALSE;
|
||
CPoint g_point, g_ptOld;
|
||
|
||
void GetRectBmpFromBmp( CWnd *pWnd ,CRect rectClient, CBitmap &bitmap)
|
||
{
|
||
CClientDC dc(pWnd);
|
||
CDC memDC;
|
||
CRect rect;
|
||
memDC.CreateCompatibleDC(&dc);
|
||
pWnd->GetWindowRect(rect);
|
||
bitmap.CreateCompatibleBitmap(&dc, rectClient.Width(), rectClient.Height());
|
||
|
||
CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
|
||
memDC.BitBlt(0, 0, rectClient.Width(),rectClient.Height(), &dc, rectClient.left,rectClient.top,SRCCOPY);
|
||
memDC.SelectObject(pOldBitmap);
|
||
|
||
}
|
||
|
||
|
||
BOOL OnMouseMove(UINT_PTR nFlags, CPoint point)
|
||
{
|
||
CWinApp* pApp = AfxGetApp();
|
||
HICON hIcon = pApp->LoadCursor(IDC_CUR_CELLMOVE);
|
||
::SetCursor( hIcon );
|
||
// SHORT nState=GetKeyState(VK_LBUTTON);
|
||
|
||
bool bCtrl=(GetKeyState(VK_LBUTTON)&-128)!=0;
|
||
|
||
if(g_bTracking && bCtrl) {
|
||
|
||
CDC *pDC=acedGetAcadFrame()->GetDC();
|
||
ASSERT(pDC);
|
||
CSize size(1,1);
|
||
CRect rectOld(g_point, g_ptOld);
|
||
rectOld.NormalizeRect();
|
||
CRect rectNew(g_point, point);
|
||
rectNew.NormalizeRect();
|
||
// 绘制矩形拖曳线
|
||
pDC->DrawDragRect(rectNew, size, rectOld, size);
|
||
g_ptOld=point;
|
||
acedGetAcadFrame()->ReleaseDC(pDC);
|
||
return TRUE;
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
|
||
// Move From DgnSpace
|
||
BOOL DragMsgHook(MSG* msg)
|
||
{
|
||
CMDIFrameWnd *pWnd=acedGetAcadFrame();
|
||
if(!pWnd)
|
||
return FALSE;
|
||
|
||
BOOL nRet = FALSE;
|
||
switch(msg->message) {
|
||
case WM_LBUTTONDOWN:
|
||
{
|
||
if(!g_bTracking){
|
||
g_bTracking = TRUE;
|
||
acedGetAcadFrame()->SetCapture();
|
||
CPoint ptDwgView = msg->pt;
|
||
pWnd->ScreenToClient(&ptDwgView);
|
||
g_point = ptDwgView;
|
||
}
|
||
else{
|
||
g_bTracking = FALSE;
|
||
::ReleaseCapture();
|
||
acedPostCommand(_T(" "));
|
||
}
|
||
}
|
||
break;
|
||
case WM_LBUTTONUP:
|
||
if(g_bTracking){
|
||
g_bTracking = FALSE;
|
||
CSize size(1,1);
|
||
CDC *pDC=acedGetAcadFrame()->GetDC();
|
||
CPoint ptDwgView = msg->pt;
|
||
pWnd->ScreenToClient(&ptDwgView);
|
||
CRect rectNew(g_point, ptDwgView);
|
||
rectNew.NormalizeRect();
|
||
pDC->DrawDragRect(rectNew, size, NULL, size);
|
||
acedGetAcadFrame()->ReleaseDC(pDC);
|
||
::ReleaseCapture();
|
||
acedPostCommand(_T(" "));
|
||
}
|
||
break;
|
||
case WM_MOUSEMOVE:
|
||
{
|
||
CPoint ptDwgView = msg->pt;
|
||
pWnd->ScreenToClient(&ptDwgView);
|
||
OnMouseMove(msg->wParam, ptDwgView);
|
||
}
|
||
break;
|
||
case WM_KEYDOWN:
|
||
if(msg->wParam==VK_ESCAPE) {
|
||
acedPostCommand(_T(" "));
|
||
}
|
||
break;
|
||
}
|
||
return false;//鼠标消息不会被ACAD截获
|
||
}
|
||
|
||
void InitMsgHook(BOOL bTrue)
|
||
{
|
||
static BOOL bMsgHook=FALSE;
|
||
if(bTrue) {
|
||
if(!bMsgHook)
|
||
bMsgHook=acedRegisterFilterWinMsg(DragMsgHook);
|
||
} else {
|
||
if(bMsgHook) {
|
||
acedRemoveFilterWinMsg(DragMsgHook);
|
||
bMsgHook=FALSE;
|
||
}
|
||
}
|
||
}
|
||
|
||
void CatchScreenCmd()
|
||
{
|
||
adsout << _T("\n请按下鼠标拖动希望截图的范围<退出>:");
|
||
InitMsgHook(TRUE);
|
||
curDoc()->inputPointManager()->disableSystemCursorGraphics();
|
||
|
||
g_bTracking = FALSE;
|
||
g_point = CPoint();
|
||
g_ptOld = CPoint();
|
||
|
||
int nKey, ret;
|
||
while(1){
|
||
ret = ads_getint(_T(""),&nKey);
|
||
if(ret == 5000)
|
||
break;
|
||
}
|
||
|
||
InitMsgHook(FALSE);
|
||
curDoc()->inputPointManager()->enableSystemCursorGraphics();
|
||
CPoint pt1, pt2;
|
||
CRect rectNew(g_point, g_ptOld);
|
||
rectNew.NormalizeRect();
|
||
|
||
pt1 = rectNew.TopLeft();
|
||
pt2 = rectNew.BottomRight();
|
||
|
||
if(pt1 == CPoint() || pt2 == CPoint())
|
||
return;
|
||
|
||
CRect rectVP(pt1, pt2);
|
||
ads_command(RTSTR,_T(".UCSICON"),RTSTR,_T("OFF"),RTNONE);
|
||
CBitmap bitmap;
|
||
GetRectBmpFromBmp(acedGetAcadFrame(), rectVP, bitmap);
|
||
HBITMAP hBitmap = (HBITMAP) bitmap.GetSafeHandle();
|
||
|
||
CFileDialog dlg(FALSE,_T("*.JPG"),_T(""),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
|
||
_T("JPG文件 (*.JPG) |*.JPG||"),acedGetAcadFrame());
|
||
if(dlg.DoModal()!=IDOK)
|
||
return;
|
||
TCHAR szShortPath[256]=_T("");
|
||
TCHAR bmpPrefix[256];
|
||
_tcscpy(szShortPath, dlg.GetPathName());
|
||
CString csFileName = szShortPath;
|
||
csFileName = csFileName.Left(csFileName.GetLength() - 4) + _T(".bmp");
|
||
_tcscpy(bmpPrefix, csFileName);
|
||
SaveBitmapToFile(hBitmap, bmpPrefix);
|
||
ads_command(RTSTR,_T(".UCSICON"),RTSTR,_T("ON"),RTNONE);
|
||
|
||
|
||
// #ifndef _WIN64
|
||
// FILE *fpIn = _tfopen(bmpPrefix, _T("rb"));
|
||
// FILE *fpOut = _tfopen(szShortPath, _T("wb"));
|
||
// if(!fpIn || !fpOut)
|
||
// return;
|
||
// int bOk = WriteJpeg(fpIn, fpOut);
|
||
// fclose(fpIn);
|
||
// fclose(fpOut);
|
||
// #else
|
||
XString sTempFile=GetTempFileName(_T(".jpg"));
|
||
int bOk = CTangentImage::WriteJpeg(bmpPrefix, szShortPath, CXIMAGE_FORMAT_JPG);
|
||
// #endif // _WIN64
|
||
|
||
_tremove(bmpPrefix);
|
||
}
|
||
|
||
//***************************************************************************************************
|
||
// 图块改色
|
||
//***************************************************************************************************
|
||
BOOL ExplodeEntity2(AcDbEntity* pEnt, AcDbVoidPtrArray& arpNewSet)
|
||
{
|
||
|
||
if(pEnt == NULL)
|
||
return FALSE;
|
||
|
||
AcDbVoidPtrArray entSet;
|
||
if(pEnt->isKindOf(AcDbAlignedDimension::desc())){
|
||
return FALSE;
|
||
}
|
||
|
||
Acad::ErrorStatus es = pEnt->explode(entSet);
|
||
//////////////////////////////////////////////////////////////////////////////////////
|
||
//对于图块特殊处理, 因为炸开后, 属性字不能正常显示, 这里新生成一个文字
|
||
if(pEnt->isKindOf(AcDbBlockReference::desc())){
|
||
AcDbBlockReference *pInsert = (AcDbBlockReference *)pEnt;
|
||
AcDbObjectIterator *pAttrIterator = NULL;
|
||
pAttrIterator = pInsert->attributeIterator();
|
||
if(pAttrIterator != NULL){
|
||
for (pAttrIterator->start();!pAttrIterator->done();pAttrIterator->step())
|
||
{
|
||
AcDbObjectId att_id;
|
||
att_id = pAttrIterator->objectId();
|
||
AcDbEntity *pEnt2 = NULL;
|
||
AcDbAttribute *pAtt = NULL;
|
||
acdbOpenAcDbEntity(pEnt2, att_id, AcDb::kForRead);
|
||
if(pEnt2 != NULL){
|
||
if(pAtt = AcDbAttribute::cast(pEnt2)){
|
||
AcDbText *pText = new AcDbText;
|
||
pText->copyFrom(pAtt);
|
||
TCHAR *szText2 = pAtt->textString();
|
||
pText->setTextString(szText2);
|
||
delete szText2;
|
||
pText->setHorizontalMode(pAtt->horizontalMode());
|
||
pText->setVerticalMode(pAtt->verticalMode());
|
||
pText->setPosition(pAtt->position());
|
||
pText->setAlignmentPoint(pAtt->alignmentPoint());
|
||
pText->setTextStyle(pAtt->textStyle());
|
||
pText->setHeight(pAtt->height());
|
||
arpNewSet.append(pText);
|
||
}
|
||
pEnt2->close();
|
||
}
|
||
}
|
||
}
|
||
delete pAttrIterator;
|
||
}
|
||
//////////////////////////////////////////////////////////////////////////////////////
|
||
|
||
int num=entSet.length();
|
||
if(num == 0){
|
||
return FALSE; //如果不能再删除, 说明是简单对象, 直接返回
|
||
}
|
||
for(int n=0; n<num; n++) {
|
||
AcDbEntity *pNewEnt=(AcDbEntity *)entSet[n];
|
||
if(pNewEnt == NULL)
|
||
continue;
|
||
if(ExplodeEntity2(pNewEnt, arpNewSet))
|
||
{
|
||
delete pNewEnt; //如果还能删除, delete掉父实体, 不会内存泄漏
|
||
}
|
||
else
|
||
{
|
||
arpNewSet.append(pNewEnt);//最末端实体, 直接加入链表
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
//在图块内分解一切可分解的对象
|
||
BOOL DeepExplodeBlock2(AcDbBlockTableRecord *pRec)
|
||
{
|
||
AcDbBlockTableRecordIterator *pRecIter=NULL;
|
||
if(pRec->newIterator(pRecIter)==Acad::eOk && pRecIter) {
|
||
} else
|
||
return FALSE;
|
||
|
||
//第一步, 对块表记录中的对象进行分解
|
||
AcDbVoidPtrArray arpNewSet;
|
||
AcDbVoidPtrArray arpDelSet;
|
||
AcDbObjectIdArray arrId;
|
||
for(pRecIter->start(); !pRecIter->done(); pRecIter->step()) {
|
||
AcDbEntity *pEnt=NULL;
|
||
if(pRecIter->getEntity(pEnt, AcDb::kForWrite)==Acad::eOk) {
|
||
ASSERT(pEnt);
|
||
if(ExplodeEntity2(pEnt, arpNewSet)){//循环炸碎对象, 如果能分解, 就把该对象删除
|
||
AcDbObjectId id = pEnt->objectId();
|
||
arrId.append(id);
|
||
//但现在不能删除, 因为自定义实体还有依赖关系. 先存放起来
|
||
}
|
||
pEnt->close();
|
||
}
|
||
}
|
||
//对块表中的上华对象(复杂对象)进行删除
|
||
for(int j=0;j<arrId.length();j++){
|
||
AcDbEntity *pEnt=NULL;
|
||
AcDbObjectId id = arrId[j];
|
||
acdbOpenAcDbEntity(pEnt, id, AcDb::kForWrite);
|
||
if(pEnt != NULL){
|
||
pEnt->erase();
|
||
pEnt->close();
|
||
}
|
||
|
||
}
|
||
|
||
delete pRecIter;
|
||
|
||
//第二步, 把新对象加入图块记录中
|
||
int idx = arpNewSet.length();
|
||
while((--idx) >= 0)
|
||
{
|
||
AcDbEntity* pNewEnt = (AcDbEntity*)arpNewSet[idx];
|
||
if (pNewEnt != NULL)
|
||
{
|
||
Acad::ErrorStatus es = pRec->appendAcDbEntity(pNewEnt);
|
||
VERIFY(es==Acad::eOk);
|
||
pNewEnt->close();
|
||
}
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
|
||
BOOL ExplodeEntity_old(AcDbEntity* pEnt, AcDbVoidPtrArray& arpNewSet)
|
||
{
|
||
|
||
if(pEnt == NULL)
|
||
return FALSE;
|
||
|
||
AcDbVoidPtrArray entSet;
|
||
if(pEnt->isKindOf(AcDbAlignedDimension::desc())){
|
||
return FALSE;
|
||
}
|
||
|
||
Acad::ErrorStatus es = pEnt->explode(entSet);
|
||
//////////////////////////////////////////////////////////////////////////////////////
|
||
//对于图块特殊处理, 因为炸开后, 属性字不能正常显示, 这里新生成一个文字
|
||
if(pEnt->isKindOf(AcDbBlockReference::desc())){
|
||
AcDbBlockReference *pInsert = (AcDbBlockReference *)pEnt;
|
||
AcDbObjectIterator *pAttrIterator = NULL;
|
||
pAttrIterator = pInsert->attributeIterator();
|
||
if(pAttrIterator != NULL){
|
||
for (pAttrIterator->start();!pAttrIterator->done();pAttrIterator->step())
|
||
{
|
||
AcDbObjectId att_id;
|
||
att_id = pAttrIterator->objectId();
|
||
AcDbEntity *pEnt2 = NULL;
|
||
AcDbAttribute *pAtt = NULL;
|
||
acdbOpenAcDbEntity(pEnt2, att_id, AcDb::kForRead);
|
||
if(pEnt2 != NULL){
|
||
if(pAtt = AcDbAttribute::cast(pEnt2)){
|
||
AcDbText *pText = new AcDbText;
|
||
pText->copyFrom(pAtt);
|
||
TCHAR *szText2 = pAtt->textString();
|
||
pText->setTextString(szText2);
|
||
delete szText2;
|
||
pText->setHorizontalMode(pAtt->horizontalMode());
|
||
pText->setVerticalMode(pAtt->verticalMode());
|
||
pText->setPosition(pAtt->position());
|
||
pText->setAlignmentPoint(pAtt->alignmentPoint());
|
||
pText->setTextStyle(pAtt->textStyle());
|
||
pText->setHeight(pAtt->height());
|
||
arpNewSet.append(pText);
|
||
}
|
||
pEnt2->close();
|
||
}
|
||
}
|
||
}
|
||
delete pAttrIterator;
|
||
}
|
||
//////////////////////////////////////////////////////////////////////////////////////
|
||
|
||
int num=entSet.length();
|
||
if(num == 0){
|
||
return FALSE; //如果不能再删除, 说明是简单对象, 直接返回
|
||
}
|
||
for(int n=0; n<num; n++) {
|
||
AcDbEntity *pNewEnt=(AcDbEntity *)entSet[n];
|
||
if(pNewEnt == NULL)
|
||
continue;
|
||
if(ExplodeEntity_old(pNewEnt, arpNewSet))
|
||
{
|
||
delete pNewEnt; //如果还能删除, delete掉父实体, 不会内存泄漏
|
||
}
|
||
else
|
||
{
|
||
arpNewSet.append(pNewEnt);//最末端实体, 直接加入链表
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
//在图块内分解一切可分解的对象
|
||
BOOL DeepExplodeBlock_old(AcDbBlockTableRecord *pRec, BOOL bOnlyBlock)
|
||
{
|
||
AcDbBlockTableRecordIterator *pRecIter=NULL;
|
||
if(pRec->newIterator(pRecIter)==Acad::eOk && pRecIter) {
|
||
} else
|
||
return FALSE;
|
||
|
||
//第一步, 对块表记录中的对象进行分解
|
||
AcDbVoidPtrArray arpNewSet;
|
||
AcDbVoidPtrArray arpDelSet;
|
||
AcDbObjectIdArray arrId;
|
||
for(pRecIter->start(); !pRecIter->done(); pRecIter->step()) {
|
||
AcDbEntity *pEnt=NULL;
|
||
if(pRecIter->getEntity(pEnt, AcDb::kForWrite)==Acad::eOk) {
|
||
ASSERT(pEnt);
|
||
if(pEnt->isKindOf(AcDbBlockReference::desc()) || bOnlyBlock == FALSE)
|
||
{
|
||
if(ExplodeEntity_old(pEnt, arpNewSet)){//循环炸碎对象, 如果能分解, 就把该对象删除
|
||
AcDbObjectId id = pEnt->objectId();
|
||
arrId.append(id);
|
||
//但现在不能删除, 因为自定义实体还有依赖关系. 先存放起来
|
||
}
|
||
}
|
||
|
||
pEnt->close();
|
||
}
|
||
}
|
||
//对块表中的上华对象(复杂对象)进行删除
|
||
for(int j=0;j<arrId.length();j++){
|
||
AcDbEntity *pEnt=NULL;
|
||
AcDbObjectId id = arrId[j];
|
||
acdbOpenAcDbEntity(pEnt, id, AcDb::kForWrite);
|
||
if(pEnt != NULL){
|
||
pEnt->erase();
|
||
pEnt->close();
|
||
}
|
||
|
||
}
|
||
|
||
delete pRecIter;
|
||
|
||
//第二步, 把新对象加入图块记录中
|
||
int idx = arpNewSet.length();
|
||
acedSetStatusBarProgressMeter(_T("图块分析中..."), 0, arpNewSet.length());
|
||
while((--idx) >= 0)
|
||
{
|
||
acedSetStatusBarProgressMeterPos(arpNewSet.length()-idx);
|
||
AcDbEntity* pNewEnt = (AcDbEntity*)arpNewSet[idx];
|
||
if (pNewEnt != NULL)
|
||
{
|
||
Acad::ErrorStatus es = pRec->appendAcDbEntity(pNewEnt);
|
||
VERIFY(es==Acad::eOk);
|
||
pNewEnt->close();
|
||
}
|
||
}
|
||
acedRestoreStatusBar();
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
void ChangeBlkColor(AcDbBlockReference* pRef,int iColor)
|
||
{
|
||
if (!pRef)
|
||
return;
|
||
AcDbObjectId idBlock = pRef->blockTableRecord();
|
||
AcDbBlockTableRecordIterator *pIterator = NULL;
|
||
OPENOBJ_BEGIN(idBlock, AcDb::kForWrite, AcDbBlockTableRecord , pRec);
|
||
if(pRec)
|
||
pRec->newIterator(pIterator);
|
||
OPENOBJ_END();
|
||
if (pIterator)
|
||
{
|
||
for(pIterator->start(); !pIterator->done(); pIterator->step())
|
||
{
|
||
AcDbEntity *pEnt = NULL;
|
||
pIterator->getEntity(pEnt, AcDb::kForWrite);
|
||
if(pEnt != NULL)
|
||
{
|
||
if (pEnt->isKindOf(AcDbBlockReference::desc()))
|
||
{
|
||
pEnt->setColorIndex(iColor);//随块
|
||
AcDbBlockReference* pRef = AcDbBlockReference::cast(pEnt);
|
||
ChangeBlkColor(pRef,iColor);
|
||
}
|
||
else
|
||
{
|
||
pEnt->setColorIndex(0);//随块
|
||
}
|
||
pEnt->close();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void ChangeBlkColorCmd()
|
||
{
|
||
RBList rbMask(RTDXF0, _T("INSERT,ATS_EQUIPMENT"), NULL);
|
||
//2006-5-25 修改 图块改颜色,修改图块内子实体的颜色为“随块”
|
||
PickSet ss(SS_FREE);
|
||
if(SelectEntities(_T("\n请选择要修改颜色的图块<退出>:"), ss, rbMask) != RTNORM)
|
||
return;
|
||
int iColor = 1;
|
||
if (Adesk::kTrue != acedSetColorDialog(iColor, Adesk::kFalse, iColor))
|
||
return;
|
||
|
||
long len = ss.Length();
|
||
for(long i=0;i<len;i++){
|
||
Entity entBlk = ss[i];
|
||
OPENOBJ_BEGIN(entBlk, AcDb::kForWrite, AcDbEntity, pEnt);
|
||
if(pEnt){
|
||
pEnt->setColorIndex(iColor);
|
||
}
|
||
OPENOBJ_END();
|
||
if(entBlk.Is(_T("INSERT")))
|
||
{
|
||
//modify liaoy 2016-8-26
|
||
OPENOBJ_BEGIN(entBlk, AcDb::kForWrite, AcDbBlockReference, pRef);
|
||
ChangeBlkColor(pRef,iColor);
|
||
OPENOBJ_END();
|
||
|
||
/*
|
||
AcDbObjectId idBlock = NULL;
|
||
OPENOBJ_BEGIN(entBlk,AcDb::kForRead, AcDbBlockReference, pBlk);
|
||
if (pBlk)
|
||
{
|
||
idBlock = pBlk->blockTableRecord();
|
||
}
|
||
OPENOBJ_END();
|
||
|
||
//处理嵌套图块
|
||
AcDbBlockTableRecordIterator *pIterator = NULL;
|
||
OPENOBJ_BEGIN(idBlock, AcDb::kForWrite, AcDbBlockTableRecord , pRec);
|
||
if(pRec){
|
||
pRec->newIterator(pIterator);
|
||
if(!pRec->isFromExternalReference()) //外部参考不支持 2011-10-24
|
||
{
|
||
DeepExplodeBlock_old(pRec, TRUE);
|
||
}
|
||
}
|
||
OPENOBJ_END();
|
||
|
||
|
||
|
||
for(pIterator->start(); !pIterator->done(); pIterator->step()){
|
||
AcDbEntity *pEnt = NULL;
|
||
pIterator->getEntity(pEnt, AcDb::kForWrite);
|
||
if(pEnt != NULL)
|
||
{
|
||
pEnt->setColorIndex(0);//随块
|
||
pEnt->close();
|
||
}
|
||
|
||
}
|
||
*/
|
||
//modify end
|
||
}
|
||
else if(entBlk.Is(_T("ATS_EQUIPMENT")))
|
||
{
|
||
AcDbBlockTableRecordIterator *pIterator;
|
||
AcDbObjectId idRec = NULL;
|
||
OPENOBJ_BEGIN(entBlk, AcDb::kForRead, TDbEquipment, pEquip);
|
||
if(pEquip)
|
||
idRec = pEquip->GetBlock2d();
|
||
OPENOBJ_END();
|
||
|
||
OPENOBJ_BEGIN(idRec, AcDb::kForRead, AcDbBlockTableRecord, pRec);
|
||
if(pRec)
|
||
pRec->newIterator(pIterator);
|
||
OPENOBJ_END();
|
||
for(pIterator->start(); !pIterator->done(); pIterator->step()){
|
||
AcDbEntity *pEnt = NULL;
|
||
pIterator->getEntity(pEnt, AcDb::kForWrite);
|
||
if(pEnt != NULL)
|
||
{
|
||
pEnt->setColorIndex(0);//随块
|
||
pEnt->close();
|
||
}
|
||
}
|
||
delete pIterator;
|
||
}
|
||
}
|
||
TCHAR chText[256];
|
||
ads_getstring(NULL, _T("\n同名图块是否同时变颜色?<N>: "), chText);
|
||
if(_tcsicmp(chText, _T("Y")) == 0)
|
||
{
|
||
XStringList lstName;
|
||
for(i=0;i<len;i++){
|
||
Entity entBlk = ss[i];
|
||
TCHAR szName[256];
|
||
entBlk.GetData(2, szName);
|
||
int idx = lstName.Index(szName);
|
||
if(idx > -1)
|
||
continue;
|
||
lstName.Append(tstrnew(szName));
|
||
RBList rbMask2(RTDXF0, _T("INSERT,ATS_EQUIPMENT"), 2, szName, NULL);
|
||
PickSet ssAll(SS_FREE);
|
||
ssAll.Get(_T("X"), NULL, NULL, rbMask2);
|
||
long len2 = ssAll.Length();
|
||
for(long j=0;j<len2;j++)
|
||
{
|
||
Entity ent2 = ssAll[j];
|
||
OPENOBJ_BEGIN(ent2, AcDb::kForWrite, AcDbEntity, pEnt);
|
||
if(pEnt){
|
||
pEnt->setColorIndex(iColor);
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
}
|
||
}
|
||
|
||
UpdateGraphic(ss);
|
||
actrTransactionManager->flushGraphics(); //acad 刷新
|
||
acedUpdateDisplay();
|
||
|
||
}
|
||
|
||
|
||
void ChangeBlkNameCmd()
|
||
{
|
||
RBList rbMask(RTDXF0, _T("ATS_EQUIPMENT,ATS_WELL"), NULL);
|
||
|
||
Entity entBlk;
|
||
if(SelectEntity(_T("\n请选择要修改名字的图块<退出>:"), entBlk, rbMask) != RTNORM)
|
||
return;
|
||
AcDbObjectId idRec = NULL;
|
||
|
||
OPENOBJ_BEGIN(entBlk, AcDb::kForRead, TDbEquipment, pEquip);
|
||
if(pEquip)
|
||
idRec = pEquip->GetBlock2d();
|
||
OPENOBJ_END();
|
||
|
||
CString csRecordName;
|
||
AcDbObjectId idNew = NULL;
|
||
OPENOBJ_BEGIN(idRec, AcDb::kForWrite, AcDbBlockTableRecord, pRec);
|
||
if(pRec)
|
||
{
|
||
TCHAR *str = NULL;
|
||
pRec->getName(str);
|
||
csRecordName = str;
|
||
delete str;
|
||
TCHAR chText[256];
|
||
CString csTmp;
|
||
csTmp.Format(_T("\nn请输入新图块名<%s>: "), csRecordName);
|
||
|
||
ads_getstring(NULL, csTmp, chText);
|
||
CString csName = chText;
|
||
if(csName == _T(""))
|
||
return;
|
||
|
||
idNew = GetBlockIdFromString(csName);
|
||
}
|
||
OPENOBJ_END();
|
||
if(idNew == NULL)
|
||
return;
|
||
|
||
RBList rbMask2(RTDXF0, _T("ATS_EQUIPMENT,ATS_WELL"), 2, csRecordName, NULL);
|
||
PickSet ssAll(SS_FREE);
|
||
ssAll.Get(_T("X"), NULL, NULL, rbMask2);
|
||
|
||
long len2 = ssAll.Length();
|
||
for(long j=0;j<len2;j++)
|
||
{
|
||
Entity ent2 = ssAll[j];
|
||
OPENOBJ_BEGIN(ent2, AcDb::kForWrite, TDbEquipment, pEnt);
|
||
if(pEnt){
|
||
pEnt->SetBlock2d(idNew);
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
//***************************************************************************************************
|
||
// 设置标高
|
||
//***************************************************************************************************
|
||
|
||
|
||
void SetElev(Entity ent, double dElev)
|
||
{
|
||
int nFlag=0;
|
||
if(ent.Is(_T("LINE")))
|
||
{
|
||
XLine ln(ent);
|
||
ln.StartPoint().z=ln.EndPoint().z=dElev;
|
||
ln.Modify(&ent);
|
||
}
|
||
else if(ent.Is(_T("ARC")) || ent.Is(_T("CIRCLE"))){
|
||
OPENOBJ_BEGIN(ent,AcDb::kForWrite,AcDbCurve,pEnt)
|
||
if(pEnt)
|
||
{
|
||
XPoint pt;
|
||
if(ent.Is(_T("ARC")))
|
||
{
|
||
pt=((AcDbArc*)pEnt)->center();
|
||
((AcDbArc*)pEnt)->setCenter(XPoint(pt.x,pt.y,dElev));
|
||
}
|
||
else
|
||
{
|
||
pt=((AcDbCircle*)pEnt)->center();
|
||
((AcDbCircle*)pEnt)->setCenter(XPoint(pt.x,pt.y,dElev));
|
||
}
|
||
}
|
||
OPENOBJ_END()
|
||
}
|
||
else if(ent.Is(_T("LWPOLYLINE")))
|
||
{
|
||
OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbPolyline, pline);
|
||
if(pline)
|
||
pline->setElevation(dElev);
|
||
OPENOBJ_END();
|
||
}
|
||
else if(ent.Is(_T("DIMENSION")))
|
||
{
|
||
|
||
OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbDimension, pDim);
|
||
if(pDim) {
|
||
double nElev=pDim->elevation();
|
||
AcGePoint3d ptText=pDim->textPosition();
|
||
AcGePoint3d ptDimBlk=pDim->dimBlockPosition();
|
||
nElev=dElev;
|
||
ptText[2]=dElev;
|
||
ptDimBlk[2]=dElev;
|
||
pDim->setElevation(nElev);
|
||
// ASSERT(fabs(pDim->elevation())<_DIST_SNAP);
|
||
pDim->setTextPosition(ptText);
|
||
pDim->setDimBlockPosition(ptDimBlk);
|
||
}
|
||
OPENOBJ_END();
|
||
|
||
ent.FreeGroups();
|
||
for(int i=10; i<16; i++) {
|
||
XPoint pt;
|
||
if(ent.GetData(i, &pt)==RTNORM) {
|
||
pt.z=dElev;
|
||
ent.SetData(i, &pt);
|
||
}
|
||
}
|
||
ent.Modify();
|
||
} else if(ent.Is(_T("INSERT")))
|
||
{
|
||
XPoint ptIns;
|
||
ent.GetData(10, &ptIns);
|
||
ptIns.z=dElev;
|
||
ent.SetData(10, &ptIns);
|
||
ent.Modify();
|
||
Entity entnext=ent;
|
||
while(entnext.GetNext()==RTNORM)
|
||
{
|
||
entnext.FreeGroups();
|
||
if(!entnext.Is(_T("ATTRIB")))
|
||
{
|
||
break;
|
||
}
|
||
XPoint pt10, pt11;
|
||
if(entnext.GetData(10, &pt10)==RTNORM)
|
||
{
|
||
pt10.z=dElev;
|
||
entnext.SetData(10, &pt10);
|
||
}
|
||
if(entnext.GetData(11, &pt11)==RTNORM)
|
||
{
|
||
pt11.z=dElev;
|
||
entnext.SetData(11, &pt11);
|
||
}
|
||
entnext.Modify();
|
||
}
|
||
ent.Update();
|
||
} else if(ent.Is(_T("TEXT")) || ent.Is(_T("MTEXT")))
|
||
{
|
||
XPoint pt10, pt11;
|
||
if(ent.GetData(10, &pt10)==RTNORM)
|
||
{
|
||
pt10.z=dElev;
|
||
ent.SetData(10, &pt10);
|
||
}
|
||
if(ent.GetData(11, &pt11)==RTNORM)
|
||
{
|
||
pt11.z=dElev;
|
||
ent.SetData(11, &pt11);
|
||
}
|
||
ent.Modify();
|
||
}
|
||
else if(ent.Is(_T("HATCH"))) {
|
||
OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbHatch, pHatch);
|
||
if(pHatch) {
|
||
pHatch->setElevation(dElev);
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
else if(ent.Is(_T("POINT"))) {
|
||
OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbPoint, pPoint);
|
||
if(pPoint) {
|
||
XPoint pt0 = pPoint->position();
|
||
pPoint->setPosition(XPoint(pt0.x,pt0.y,dElev));
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
else if(ent.Is(_T("POLYLINE")) /*&& ent.GetData(70, &nFlag)==RTNORM && nFlag<7*/)
|
||
{
|
||
OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDb2dPolyline, pline);
|
||
if(pline)
|
||
pline->setElevation(dElev);
|
||
OPENOBJ_END();
|
||
} else if(ent.Is(_T("ELLIPSE"))) {
|
||
OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbEllipse, pEllipse);
|
||
if(pEllipse) {
|
||
AcGePoint3d ptCen=pEllipse->center();
|
||
ptCen.z=dElev;
|
||
pEllipse->setCenter(ptCen);
|
||
}
|
||
OPENOBJ_END();
|
||
} else if(ent.Is(_T("SPLINE"))) {
|
||
OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbSpline, pEnt);
|
||
if(pEnt) {
|
||
int num=pEnt->numControlPoints();
|
||
for(int n=0; n<num; n++) {
|
||
AcGePoint3d pt;
|
||
if(pEnt->getControlPointAt(n, pt)==Acad::eOk) {
|
||
pt.z=dElev;
|
||
pEnt->setControlPointAt(n, pt);
|
||
}
|
||
}
|
||
}
|
||
OPENOBJ_END();
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
// Command: 统一标高
|
||
void ModifyElev()
|
||
{
|
||
double dElev = 0;
|
||
ads_getreal(_T("\n请输入新的标高:<0>"), &dElev);
|
||
|
||
PickSet ss(SS_FREE);
|
||
g_ssPickFirst.Free();
|
||
if(SelectEntities(_T("\n选择需要修改标高的对象:"), ss, RBList())==RTNORM) {
|
||
long lCount=ss.Length();
|
||
acedSetStatusBarProgressMeter(_T("修改中..."), 0, lCount);
|
||
|
||
for(long i=0L; i<lCount; i++) {
|
||
acedSetStatusBarProgressMeterPos(i);
|
||
Entity ent=ss[i];
|
||
SetElev(ent, dElev);
|
||
}
|
||
acedRestoreStatusBar();
|
||
}
|
||
}
|
||
|
||
void DrawOpeningBy2Wall()
|
||
{
|
||
|
||
// CString csDwbName = _T("f:\\doe2.wea");
|
||
// XDrawingLib DwbLib(csDwbName);
|
||
// XStringList lstDwbLib;
|
||
// DwbLib.GetAll(lstDwbLib);
|
||
// int len = lstDwbLib.Length();
|
||
// for(int i=0;i<len;i++)
|
||
// {
|
||
// CString csFile = lstDwbLib[i];
|
||
// csFile = _T("f:\\") + csFile;
|
||
// // DwbLib.Move(i, csFile);
|
||
//
|
||
//
|
||
// DwbLib.QuickCopy(csFile);
|
||
// }
|
||
|
||
//1.修改比例因子
|
||
|
||
|
||
}
|
||
|
||
|
||
/*
|
||
|
||
// Command: 补门窗
|
||
extern void GetLineMax2Pt(XPoint pt1, XPoint pt2, XPoint &pt3, XPoint &pt4);
|
||
|
||
//根据2断墙 补插入门,窗,凸窗
|
||
void DrawOpeningBy2Wall()
|
||
{
|
||
// CString csFileName1;
|
||
// CAcModuleResourceOverride vTemp;
|
||
// CFileDialog dlg(TRUE,_T("*.shx"),csFileName1,OFN_ALLOWMULTISELECT|OFN_HIDEREADONLY,
|
||
// _T("字体(*.shx) |*.shx||"), acedGetAcadFrame());
|
||
// TCHAR strDlgTitle[] = _T("选择要压缩的字体文件");
|
||
// dlg.m_ofn.lpstrTitle = strDlgTitle;
|
||
// if(dlg.DoModal()!=IDOK)
|
||
// return;
|
||
// POSITION pos = dlg.GetStartPosition();
|
||
// int Num = 0;
|
||
// while(pos!=NULL)
|
||
// {
|
||
// CString csIndex;
|
||
// csIndex = dlg.GetNextPathName(pos);
|
||
// TCHAR szDrive[_MAX_DRIVE]=_T(""), szDir[_MAX_DIR]=_T(""), szFile[_MAX_FNAME]=_T(""), szExt[_MAX_EXT]=_T("");
|
||
// _tsplitpath(csIndex, szDrive, szDir, szFile, szExt);
|
||
// csFileName1 = dlg.GetPathName();
|
||
// CString csFileName2;
|
||
// csFileName2.Format("%s%s", szFile, szExt);
|
||
// CString csZipName;
|
||
// csZipName.Format("%s\\%s.zip", csFileName1, szFile);
|
||
// HZIP hz = CreateZip(csZipName, 0);
|
||
// ZipAdd(hz, csFileName2, csIndex);
|
||
// CloseZip(hz);
|
||
// }
|
||
|
||
|
||
|
||
|
||
// TGGiStreamFile streamFile;
|
||
// streamFile.UnPack(sStampFile, sTempFile);
|
||
|
||
|
||
// XASLibMan slbMan(csZipName);
|
||
// if(!slbMan) {
|
||
// AfxMessageBox(_T("无法打开zip文件"));
|
||
// return;
|
||
// }
|
||
// slbMan.Append(csFileName1);
|
||
// slbMan.Close();
|
||
|
||
|
||
|
||
// XASLibMan slbMan(csSlbFileName);
|
||
// if(!slbMan) {
|
||
// AfxMessageBox(_T("无法打开Slb文件"));
|
||
// return csErr;
|
||
// _tremove(csSldName);
|
||
// }
|
||
// int ret;
|
||
// _trename(csSldName,xsNewSldName);
|
||
// ret = slbMan.Append(xsNewSldName);
|
||
// slbMan.Close();
|
||
|
||
|
||
// return;
|
||
|
||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
RBList rbMask = ads_buildlist(RTDXF0, _T("ATS_WALL"), NULL);
|
||
|
||
PickSet ssWall(SS_FREE);
|
||
if(SelectEntities(_T("\n请选择断墙<退出>"), ssWall, rbMask) != RTNORM)
|
||
return;
|
||
if(ssWall.Length() != 2)
|
||
return;
|
||
Entity entSel1, entSel2;
|
||
entSel1 = ssWall[0L];
|
||
entSel2 = ssWall[1L];
|
||
// 1.0 获取2段墙的参数信息
|
||
XPoint p1, p2, p3, p4;
|
||
TWallData::TWallStyle style1, style2;
|
||
OPENOBJ_BEGIN(entSel1, AcDb::kForRead, TDbWall, pWall);
|
||
if(pWall){
|
||
p1 = pWall->StartPoint();
|
||
p2 = pWall->EndPoint();
|
||
style1 = pWall->GetStyle();
|
||
}
|
||
OPENOBJ_END();
|
||
OPENOBJ_BEGIN(entSel2, AcDb::kForRead, TDbWall, pWall);
|
||
if(pWall){
|
||
p3 = pWall->StartPoint();
|
||
p4 = pWall->EndPoint();
|
||
style2 = pWall->GetStyle();
|
||
}
|
||
OPENOBJ_END();
|
||
XLine line1(p1, p2, 1);
|
||
XLine line2(p3, p4, 1);
|
||
if(!Is2LineOnLine(line1,line2)){
|
||
ads_alert(_T("2墙不共线!"));
|
||
return;
|
||
}
|
||
if(style1 != style2){
|
||
ads_alert(_T("不是同材质墙!"));
|
||
return;
|
||
}
|
||
|
||
// 2.0 获取2段墙的最外侧2点以及最内侧2点
|
||
XPoint ptTmp3, ptTmp4, ptTmp1(p3), ptTmp2(p4);
|
||
GetLineMax2Pt(p1, p2, ptTmp1, ptTmp2);
|
||
XPoint ptMin1, ptMin2, ptMax1(ptTmp1), ptMax2(ptTmp2), ptIns;
|
||
if(ptTmp1 != p3 && ptTmp1 != p4){
|
||
ptMin1 = ptTmp2 == p3 ? p4 : p3;
|
||
ptMin2 = ptTmp1 == p2 ? p1 : p2;
|
||
ptTmp3 = ptTmp1 == p1 ? p2 : p1;
|
||
ptTmp1 = ptTmp2; //自己的端点
|
||
}
|
||
else{
|
||
ptMin1 = ptTmp1 == p3 ? p4 : p3;
|
||
ptMin2 = ptTmp2 == p2 ? p1 : p2;
|
||
ptTmp3 = ptTmp2 == p1 ? p2 : p1;
|
||
ptTmp1 = ptTmp1;
|
||
}
|
||
// 3.0 获取门窗的插入参数:基点,宽度
|
||
XLine line3(ptMin1, ptMin2);
|
||
double dWidth(600);
|
||
line3.MidPoint(ptIns);
|
||
dWidth = ads_distance(ptMin1, ptMin2);
|
||
|
||
AcDbObjectId idWall;
|
||
OPENOBJ_BEGIN(entSel2, AcDb::kForWrite, TDbWall, pWall);
|
||
if(pWall){
|
||
// 4.0 修改墙,让2段墙合并
|
||
if(pWall->StartPoint() == ptTmp1)
|
||
pWall->SetEndPoint(ptTmp3);
|
||
else
|
||
pWall->SetStartPoint(ptTmp3);
|
||
idWall = pWall->objectId();
|
||
|
||
// 5.0 获取插入门窗的2,3维图块信息
|
||
XString szDoor2d(256), szDoor3d(256);
|
||
AcDbObjectId idStyle2d, idStyle3d;
|
||
if(LoadDwbBlock(XString(_T("%s%s"), g_sDwbPath, SYS_WIN2D), szDoor2d)!=RTNORM)
|
||
return;
|
||
idStyle2d=InitBlock(szDoor2d);
|
||
if(LoadDwbBlock(XString(_T("%s%s"), g_sDwbPath, SYS_WIN3D), szDoor3d)!=RTNORM)
|
||
return;
|
||
idStyle3d=InitBlock(szDoor3d);
|
||
|
||
// 6.0 插入门窗
|
||
TDbOpening *pOpening=new TDbOpening(idWall, idStyle2d, idStyle3d);
|
||
pOpening->InitHardPointerId();
|
||
pOpening->m_ptLocation = ptIns;
|
||
pOpening->SetWidth(dWidth);
|
||
pOpening->SetHeight(2100);
|
||
pOpening->SetThickness(60);
|
||
pOpening->SetKind(TOpeningData::OP_WINDOW);
|
||
// pOpening->m_nOpStyle |= OPS_LIFTDOOR;
|
||
pOpening->AddToMSpace(Adesk::kFalse);
|
||
pWall->InsertOpening(pOpening);
|
||
pOpening->m_nQuadrant=1;
|
||
pOpening->close();
|
||
}
|
||
OPENOBJ_END();
|
||
|
||
}
|
||
|
||
*/
|
||
|
||
|
||
//***************************************************************************************************
|
||
// 工具条升级
|
||
//***************************************************************************************************
|
||
|
||
// 工具条升级标准
|
||
bool UpdateText(CString &sCmd)
|
||
{
|
||
if (sCmd.Compare(_T("T88")) == 0)// twt
|
||
{
|
||
sCmd = _T("T98");
|
||
}
|
||
else if (sCmd.Compare(_T("T86")) == 0) // tch
|
||
{
|
||
sCmd = _T("T96");
|
||
}
|
||
else if (sCmd.Compare(_T("T83")) == 0)// th
|
||
{
|
||
sCmd = _T("T93");
|
||
}
|
||
else if (sCmd.Compare(_T("t88")) == 0)// twt
|
||
{
|
||
sCmd = _T("t98");
|
||
}
|
||
else if (sCmd.Compare(_T("t86")) == 0) // tch
|
||
{
|
||
sCmd = _T("t96");
|
||
}
|
||
else if (sCmd.Compare(_T("t83")) == 0)// th
|
||
{
|
||
sCmd = _T("t93");
|
||
}
|
||
else
|
||
{
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
// 升级acad.pgp文件
|
||
void UpdateAcad()
|
||
{
|
||
XString fullFile, fullFile2;
|
||
if(!FindFile(_T("acad.pgp"), fullFile))
|
||
{
|
||
AfxMessageBox(_T("acad.pgp文件错误!"));
|
||
return;
|
||
}
|
||
|
||
FILE *pFile = fopen(_AS(fullFile), "r");
|
||
CString sOldText = fullFile;
|
||
int n = sOldText.ReverseFind('\\');
|
||
CString sText = sOldText.Left(n + 1);
|
||
fullFile2 = sText + _T("acadCopy.pgp");
|
||
|
||
FILE *pFileCopy = fopen(_AS(fullFile2), "w");
|
||
|
||
if(!pFile || !pFileCopy)
|
||
{
|
||
return;
|
||
}
|
||
while(!feof(pFile))
|
||
{
|
||
char sBuf[256]="";
|
||
fgets(sBuf, 255, pFile);
|
||
CString csTmp = sBuf;
|
||
csTmp.TrimRight();
|
||
int iIndex = csTmp.Find(_T("_"));
|
||
if(iIndex > 0)
|
||
{
|
||
CString sCmdLeft = csTmp.Left(iIndex);
|
||
CString sCmdRight = csTmp.Right(csTmp.GetLength() - iIndex);
|
||
CString sCmd = sCmdLeft.Right(3);
|
||
UpdateText(sCmd);
|
||
sCmdLeft = sCmdLeft.Left(sCmdLeft.GetLength() - 3);
|
||
csTmp = sCmdLeft + sCmd + sCmdRight;
|
||
}
|
||
csTmp +=_T("\n");
|
||
fputs(_AS(csTmp), pFileCopy);
|
||
}
|
||
fclose(pFile);
|
||
fclose(pFileCopy);
|
||
|
||
remove(_AS(fullFile));
|
||
rename(_AS(fullFile2), _AS(fullFile));
|
||
}
|
||
|
||
#include"TGAs.h"
|
||
// 升级tchdata.dbf文件
|
||
void UpdateTchData()
|
||
{
|
||
CodeBase db;
|
||
XString fullFile;
|
||
if(!FindFile(_T("tchdata.dbf"), fullFile))
|
||
{
|
||
AfxMessageBox(_T("tchdata.dbf文件错误!"));
|
||
return;
|
||
}
|
||
XDbfTable *pTable = db.Open(fullFile);
|
||
if(!pTable)
|
||
{
|
||
return;
|
||
}
|
||
|
||
CString sCmd, sCmdNew;
|
||
for(pTable->MoveFirst();!pTable->IsEOF();pTable->MoveNext())
|
||
{
|
||
GET_FIELD(pTable, _T("Engcmd"), sCmd);
|
||
int nIndex = sCmd.Find(_T("_"));
|
||
if(nIndex > 0)
|
||
{
|
||
CString sCmdLeft = sCmd.Left(nIndex);
|
||
sCmdLeft.TrimLeft();
|
||
CString sCmdRight = sCmd.Right(sCmd.GetLength() - nIndex);
|
||
if (!UpdateText(sCmdLeft))
|
||
{
|
||
continue;
|
||
}
|
||
sCmdNew = sCmdLeft + sCmdRight;
|
||
SET_FIELD(pTable, _T("Engcmd"), (const TCHAR*)sCmdNew);
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
// 工具条升级标准
|
||
bool UpdateText2(CString &sCmd)
|
||
{
|
||
if (sCmd.Compare(_T("T88_")) == 0 || sCmd.Compare(_T("T98_")) == 0)// twt
|
||
{
|
||
sCmd = _T("");
|
||
}
|
||
else if (sCmd.Compare(_T("T86_")) == 0 || sCmd.Compare(_T("T96_")) == 0) // tch
|
||
{
|
||
sCmd = _T("");
|
||
}
|
||
else if (sCmd.Compare(_T("T83_")) == 0 || sCmd.Compare(_T("T93_")) == 0)// th
|
||
{
|
||
sCmd = _T("");
|
||
}
|
||
else if (sCmd.Compare(_T("t88_")) == 0 || sCmd.Compare(_T("t98_")) == 0)// twt
|
||
{
|
||
sCmd = _T("");
|
||
}
|
||
else if (sCmd.Compare(_T("t86_")) == 0 || sCmd.Compare(_T("t96_")) == 0) // tch
|
||
{
|
||
sCmd = _T("");
|
||
}
|
||
else if (sCmd.Compare(_T("t83_")) == 0 || sCmd.Compare(_T("t93_")) == 0 )// th
|
||
{
|
||
sCmd = _T("");
|
||
}
|
||
else
|
||
{
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
// 升级acad.pgp文件
|
||
void UpdateAcad2()
|
||
{
|
||
XString fullFile, fullFile2;
|
||
if(!FindFile(_T("acad.pgp"), fullFile))
|
||
{
|
||
AfxMessageBox(_T("acad.pgp文件错误!"));
|
||
return;
|
||
}
|
||
|
||
FILE *pFile = fopen(_AS(fullFile), "r");
|
||
CString sOldText = fullFile;
|
||
int n = sOldText.ReverseFind('\\');
|
||
CString sText = sOldText.Left(n + 1);
|
||
fullFile2 = sText + _T("acadCopy.pgp");
|
||
|
||
FILE *pFileCopy = fopen(_AS(fullFile2), "w");
|
||
|
||
if(!pFile || !pFileCopy)
|
||
{
|
||
return;
|
||
}
|
||
while(!feof(pFile))
|
||
{
|
||
char sBuf[256]="";
|
||
fgets(sBuf, 255, pFile);
|
||
CString csTmp = sBuf;
|
||
csTmp.TrimRight();
|
||
int iIndex = csTmp.Find(_T("_"));
|
||
if(iIndex > 0)
|
||
{
|
||
iIndex++;
|
||
CString sCmdLeft = csTmp.Left(iIndex);
|
||
CString sCmdRight = csTmp.Right(csTmp.GetLength() - iIndex);
|
||
CString sCmd = sCmdLeft.Right(4);
|
||
UpdateText2(sCmd);
|
||
sCmdLeft = sCmdLeft.Left(sCmdLeft.GetLength() - 4);
|
||
csTmp = sCmdLeft + sCmd + sCmdRight;
|
||
}
|
||
csTmp +=_T("\n");
|
||
fputs(_AS(csTmp), pFileCopy);
|
||
}
|
||
fclose(pFile);
|
||
fclose(pFileCopy);
|
||
|
||
remove(_AS(fullFile));
|
||
rename(_AS(fullFile2), _AS(fullFile));
|
||
}
|
||
|
||
// 升级tchdata.dbf文件
|
||
void UpdateTchData2()
|
||
{
|
||
CodeBase db;
|
||
XString fullFile;
|
||
if(!FindFile(_T("tchdata.dbf"), fullFile))
|
||
{
|
||
AfxMessageBox(_T("tchdata.dbf文件错误!"));
|
||
return;
|
||
}
|
||
XDbfTable *pTable = db.Open(fullFile);
|
||
if(!pTable)
|
||
{
|
||
return;
|
||
}
|
||
|
||
CString sCmd, sCmdNew;
|
||
for(pTable->MoveFirst();!pTable->IsEOF();pTable->MoveNext())
|
||
{
|
||
GET_FIELD(pTable, _T("Engcmd"), sCmd);
|
||
int nIndex = sCmd.Find(_T("_"));
|
||
if(nIndex > 0)
|
||
{
|
||
nIndex++;
|
||
CString sCmdLeft = sCmd.Left(nIndex);
|
||
sCmdLeft.TrimLeft();
|
||
CString sCmdRight = sCmd.Right(sCmd.GetLength() - nIndex);
|
||
if (!UpdateText2(sCmdLeft))
|
||
{
|
||
continue;
|
||
}
|
||
sCmdNew = sCmdLeft + sCmdRight;
|
||
SET_FIELD(pTable, _T("Engcmd"), (const TCHAR*)sCmdNew);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 工具条升级
|
||
void UpdateToolBar()
|
||
{
|
||
UpdateTchData2();
|
||
UpdateAcad2();
|
||
AfxMessageBox(_T("工具条升级完成,需重启软件生效! "));
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|