Files
envi-code/SourceCode/Code2026/tg_shs/shs_public/pubCmd.cpp
T
2026-09-28 15:28:50 +08:00

2532 lines
70 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/********************************************************************
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("工具条升级完成,需重启软件生效! "));
}