Files
envi-code/SourceCode/Code2026/tg_shs/shs_kerncmd/PrivateCmds.cpp
T

1082 lines
33 KiB
C++
Raw Normal View History

2026-10-04 00:04:20 +08:00
#include "stdafx.h"
2026-09-28 15:28:50 +08:00
#include "rxregsvc.h"
#include "TgAs.h"
#include "BuildOutLineDlg.h"
2026-10-04 00:04:20 +08:00
// [2010-3-16 10:46 wubo] 移植到新Geo库
2026-09-28 15:28:50 +08:00
// extern GEOAPI XString GetTempFileName(const TCHAR *pExt);
extern TARCH_IMPEXP AcDbObjectId AddBlock(AcDbBlockTableRecord *pRec, BOOL bDoneClosed);
extern TARCH_IMPEXP int ExplodeBlockRef(AcDbBlockTableRecord &blockRec, ads_matrix matForInsert, DList<AcDbEntity> &entSet);
extern GEOAPI XString GetTempSymbolName(const TCHAR *symb);
2026-10-04 00:04:20 +08:00
// [2010-3-16 10:45 wubo] 移植到新Geo库
2026-09-28 15:28:50 +08:00
// extern GEOAPI XString Int2Char8(unsigned nIndex);
2026-10-04 00:04:20 +08:00
// [2010-3-16 10:46 wubo] 移植到新Geo库
2026-09-28 15:28:50 +08:00
// Test Command
void CheckXD()
{
AcDbObjectId idMSpace;
AcDbBlockTable *pBlockTab=NULL;
AcDbBlockTableRecord *pMspace=NULL;
VERIFY(acdbCurDwg()->getSymbolTable(pBlockTab, AcDb::kForRead)==Acad::eOk && pBlockTab);
VERIFY(pBlockTab->getAt(ACDB_MODEL_SPACE, pMspace, AcDb::kForWrite)==Acad::eOk && pMspace);
pBlockTab->close();
resbuf *rbxd=pMspace->xData();
pMspace->close();
if (rbxd) {
adsout << _T("\nOK!");
ads_relrb(rbxd);
} else {
adsout << _T("\nBad!");
}
}
///////////////////////////////////////////////////////////////
/*
void ExplSaniware()
{
XString sDwbFile;
2026-10-04 00:04:20 +08:00
if (GetFileDia(sDwbFile, 0, _T("DWB"), _T("门窗文件"))!=RTNORM)
2026-09-28 15:28:50 +08:00
return;
XStringList lstEntry;
XPathParser parser(sDwbFile);
{
XDrawingLib dwb(sDwbFile);
dwb.GetAll(lstEntry);
int len=lstEntry.Length();
for(int curSelection=0; curSelection<len; curSelection++) {
XString sDwgFile;
sDwgFile << parser.m_sDrive << parser.m_sDir << lstEntry[curSelection] << _T(".DWG");
dwb.Copy(curSelection, sDwgFile);
}
}
lstEntry.Reset();
XString sSlbFile;
sSlbFile << parser.m_sDrive << parser.m_sDir << parser.m_sFileName << _T(".SLB");
if (FindFile(sSlbFile)) {
XSlideLib slb(sSlbFile);
slb.GetAll(lstEntry);
int len=lstEntry.Length();
for(int curSelection=0; curSelection<len; curSelection++) {
XString sSldFile;
sSldFile << parser.m_sDrive << parser.m_sDir << lstEntry[curSelection] << _T(".SLD");
slb.Copy(curSelection, sSldFile);
}
}
}
*/
void ConvSaniware()
{
XString sDbfFile;
2026-10-04 00:04:20 +08:00
if (GetFileDia(sDbfFile, 0, _T("DBF"), _T("门窗文件"))!=RTNORM)
2026-09-28 15:28:50 +08:00
return;
CodeBase codebase;
XDbfTable *pTable=codebase.Open(sDbfFile);
if (pTable) {
for(pTable->MoveFirst(); !pTable->IsEOF(); pTable->MoveNext()) {
2026-10-04 00:04:20 +08:00
// sg modify 100825,解决64位移植后的BUG,强制转换后,数据为空
2026-09-28 15:28:50 +08:00
// XString sBlock;
CString sBlock;
GET_FIELD(pTable, _T("BLOCK"), sBlock);
if (sBlock.GetLength()>=5)
{
for (int n=0; n<5; n++)
// sBlock[n]=_T('0');
sBlock.SetAt(n, _T('0'));
}
SET_FIELD(pTable, _T("BLOCK"), (const TCHAR*)sBlock);
}
}
XPathParser parser(sDbfFile);
XString sSlbFile, sDwbFile;
sSlbFile << parser.m_sDrive << parser.m_sDir << parser.m_sFileName << _T(".SLB");
sDwbFile << parser.m_sDrive << parser.m_sDir << parser.m_sFileName << _T(".DWB");
XDrawingLib dwb(sDwbFile);
XSlideLib slb(sSlbFile);
XStringList lstDwg, lstSld;
dwb.GetAll(lstDwg);
slb.GetAll(lstSld);
for(int i=0; i<lstDwg.Length(); i++) {
XString sBlock;
sBlock=lstDwg[i];
if (sBlock.Length()>=5) {
for(int n=0; n<5; n++)
sBlock[n]=_T('0');
}
dwb.Rename(i, sBlock);
}
for(i=0; i<lstSld.Length(); i++) {
XString sBlock;
sBlock=lstSld[i];
if (sBlock.Length()>=5) {
for(int n=0; n<5; n++)
sBlock[n]=_T('0');
}
slb.Rename(i, sBlock);
}
}
void ConvertTgLib()
{
2026-10-04 00:04:20 +08:00
const TCHAR *pszDir=_T("d:\\tangent\\tch5\\图库转换\\");
2026-09-28 15:28:50 +08:00
XString sLibFile(256), sDwbFile(256), sSlbFile(256);
2026-10-04 00:04:20 +08:00
const TCHAR *szLibFile=_T("上华图库");
2026-09-28 15:28:50 +08:00
sLibFile << pszDir << szLibFile << _T(".tk");
sDwbFile << pszDir << szLibFile << _T(".DWB");
sSlbFile << pszDir << szLibFile << _T(".SLB");
CodeBase db;
if (!FindFile(sLibFile)) {
FieldInfo fields[4];
fields[0] = FieldInfo(_T("kind"), _T('C'), 200);
fields[1] = FieldInfo(_T("item"), _T('C'), 64);
fields[2] = FieldInfo(_T("drawing"), _T('C'), 32);
2026-10-04 00:04:20 +08:00
// Zyu modify on 100721,传入列数
2026-09-28 15:28:50 +08:00
// XDbfTable *pTable = db.Create(sLibFile, fields);
XDbfTable *pTable = db.Create(sLibFile, fields, 4);
pTable->Close();
}
XStringList lstFiles;
FindFiles(pszDir, _T("*.dwg"), lstFiles, TRUE);
XDbfTable *pTable=db.Open(sLibFile);
if (!pTable)
{
return;
}
ASSERT(pTable);
XDrawingLib dwb(sDwbFile);
XSlideLib slb(sSlbFile);
for(int i=0;i<lstFiles.Length();i++) {
XString sDwgPath, sSldPath, sDrawing;
if (GetNextItem(sDwbFile, sDrawing)!=RTNORM)
return;
XPathParser parser(lstFiles[i]);
sDwgPath << pszDir << parser.m_sDir << parser.m_sFileName << _T(".dwg");
sSldPath << pszDir << parser.m_sDir << parser.m_sFileName << _T(".sld");
dwb.Append(sDwgPath, sDrawing);
if (FindFile(sSldPath))
slb.Append(sSldPath, sDrawing);
XString sKind;
sKind=parser.m_sDir;
2026-10-04 00:04:20 +08:00
// Zyu modify on 100723,消除64位编译警告
2026-09-28 15:28:50 +08:00
//int nChNum=_tcslen(sKind);
int nChNum=(int)_tcslen(sKind);
if(nChNum>0 && sKind[nChNum-1]==_T('\\'))
sKind[nChNum-1]=EOS;
pTable->AppendBegin();
SET_FIELD(pTable, _T("kind"), sKind);
SET_FIELD(pTable, _T("item"), parser.m_sFileName);
SET_FIELD(pTable, _T("drawing"), sDrawing);
pTable->AppendEnd();
}
}
void ConvertOpLib3d(BOOL bWin)
{
2026-10-04 00:04:20 +08:00
const TCHAR *pszDir=_T("d:\\tangent\\tch5\\系统图库\\3d\\");
2026-09-28 15:28:50 +08:00
XString sLibFile(256), sDwbFile(256), sSlbFile(256);
const TCHAR *szLibFile=_T("WDLib3D");
sLibFile << pszDir << szLibFile << _T(".tk");
sDwbFile << pszDir << szLibFile << _T(".DWB");
sSlbFile << pszDir << szLibFile << _T(".SLB");
CodeBase db;
if (!FindFile(sLibFile)) {
FieldInfo fields[4];
fields[0] = FieldInfo(_T("kind"), _T('C'), 200);
fields[1] = FieldInfo(_T("item"), _T('C'), 64);
fields[2] = FieldInfo(_T("drawing"), _T('C'), 32);
2026-10-04 00:04:20 +08:00
// Zyu modify on 100721,传入列数
2026-09-28 15:28:50 +08:00
// XDbfTable *pTable = db.Create(sLibFile, fields);
XDbfTable *pTable = db.Create(sLibFile, fields, 4);
pTable->Close();
}
XStringList lstFiles;
FindFiles(pszDir, _T("*.dwg"), lstFiles, FALSE);
XDbfTable *pTable=db.Open(sLibFile);
if (!pTable)
{
return;
}
ASSERT(pTable);
XDrawingLib dwb(sDwbFile);
XSlideLib slb(sSlbFile);
for(int i=0;i<lstFiles.Length();i++) {
XString sDwgPath, sSldPath, sDrawing;
if (GetNextItem(sDwbFile, sDrawing)!=RTNORM)
return;
XPathParser parser(lstFiles[i]);
sDwgPath << pszDir << parser.m_sFileName << _T(".dwg");
sSldPath << pszDir << parser.m_sFileName << _T(".sld");
dwb.Append(sDwgPath, sDrawing);
if (FindFile(sSldPath))
slb.Append(sSldPath, sDrawing);
/*
if (pTable->MoveTo(_T("drawing"), sDrawing, CMP_INSENSITIVE)) {
2026-10-04 00:04:20 +08:00
SET_FIELD(pTable, _T("kind"), bWin? _T("窗") : _T("门"));
SET_FIELD(pTable, _T("item"), _T("新样式"));
2026-09-28 15:28:50 +08:00
SET_FIELD(pTable, _T("drawing"), sDrawing);
} else {*/
pTable->AppendBegin();
2026-10-04 00:04:20 +08:00
SET_FIELD(pTable, _T("kind"), bWin? _T("窗") : _T("门"));
SET_FIELD(pTable, _T("item"), _T("新样式"));
2026-09-28 15:28:50 +08:00
SET_FIELD(pTable, _T("drawing"), sDrawing);
pTable->AppendEnd();
//}
}
}
void ConvDoor3d()
{
ConvertOpLib3d(FALSE);
}
void ConvWin3d()
{
ConvertOpLib3d(TRUE);
}
// Test Command
void ConvertOpLib2d(BOOL bWin)
{
XString sFileIndex;
2026-10-04 00:04:20 +08:00
if (GetFileDia(sFileIndex, 0, _T("txt"), _T("门窗文件"))!=RTNORM)
2026-09-28 15:28:50 +08:00
return;
XPathParser parser(sFileIndex);
XString sLibFile(256), sDwbFile(256), sSlbFile(256);
const TCHAR *szLibFile=bWin? _T("WinLib2D") : _T("DorLib2D");
sLibFile << parser.m_sDrive << parser.m_sDir << szLibFile << _T(".tk");
sDwbFile << parser.m_sDrive << parser.m_sDir << szLibFile << _T(".DWB");
sSlbFile << parser.m_sDrive << parser.m_sDir << szLibFile << _T(".SLB");
CodeBase db;
if (!FindFile(sLibFile)) {
FieldInfo fields[4];
fields[0] = FieldInfo(_T("kind"), _T('C'), 200);
fields[1] = FieldInfo(_T("item"), _T('C'), 64);
fields[2] = FieldInfo(_T("drawing"), _T('C'), 32);
2026-10-04 00:04:20 +08:00
// Zyu modify on 100721,传入列数
2026-09-28 15:28:50 +08:00
// XDbfTable *pTable = db.Create(sLibFile, fields);
XDbfTable *pTable = db.Create(sLibFile, fields, 4);
pTable->Close();
}
XDbfTable *pTable=db.Open(sLibFile);
if (!pTable)
{
return;
}
ASSERT(pTable);
XDrawingLib dwb(sDwbFile);
XSlideLib slb(sSlbFile);
FILE *fp=_tfopen(sFileIndex, _T("r"));
while(!feof(fp)) {
TCHAR sBuf[256]=_T(""), sDwg[256]=_T(""), sDesc[256]=_T("");
_fgetts(sBuf, 255, fp);
if (sBuf[0]) {
_stscanf(sBuf, _T("%s%s"), sDwg, sDesc);
if (sDwg[0] && sDesc[0]) {
XString sDrawing=Int2Char8((unsigned)_ttoi(sDwg));
XString sDwgPath, sSldPath;
sDwgPath << parser.m_sDrive << parser.m_sDir << sDwg << _T(".dwg");
sSldPath << parser.m_sDrive << parser.m_sDir << sDwg << _T(".sld");
dwb.Append(sDwgPath, sDrawing);
slb.Append(sSldPath, sDrawing);
if (pTable->MoveTo(_T("drawing"), sDrawing, CMP_INSENSITIVE)) {
SET_FIELD(pTable, _T("item"), sDesc);
SET_FIELD(pTable, _T("drawing"), sDrawing);
} else {
pTable->AppendBegin();
SET_FIELD(pTable, _T("item"), sDesc);
SET_FIELD(pTable, _T("drawing"), sDrawing);
pTable->AppendEnd();
}
}
}
}
fclose(fp);
}
void ConvDoor2d()
{
ConvertOpLib2d(FALSE);
}
void ConvWin2d()
{
ConvertOpLib2d(TRUE);
}
2026-10-04 00:04:20 +08:00
// 分解DWB文件
2026-09-28 15:28:50 +08:00
// nFlag:
// 0--None
// 1--3D -> 3T, _T("_HOLE")->LAY_BOUNDARY
void ExplDwbArg(int nFlag)
{
XString sDwbFile;
2026-10-04 00:04:20 +08:00
if (GetFileDia(sDwbFile, 0, _T("dwb"), _T("DWB文件"))!=RTNORM)
2026-09-28 15:28:50 +08:00
return;
XDrawingLib dwb(sDwbFile);
XStringList lstEntry;
dwb.GetAll(lstEntry);
XPathParser parser(sDwbFile);
int len=lstEntry.Length();
for(int curSelection=0; curSelection<len; curSelection++) {
XString sDwgFile;
sDwgFile << parser.m_sDrive << parser.m_sDir << lstEntry[curSelection] << _T(".DWG");
dwb.Copy(curSelection, sDwgFile);
if (nFlag==1) {
AcDbDatabase db(false, true);
#if ADS < 21
if (db.readDwgFile(sDwgFile, _SH_DENYNO, false)==Acad::eOk)
#else
if (db.readDwgFile(sDwgFile, AcDbDatabase::kForReadAndAllShare, false)==Acad::eOk)
#endif
{
AcDbLayerTable *pLayTab=NULL;
VERIFY(db.getSymbolTable(pLayTab, AcDb::kForRead)==Acad::eOk);
AcDbLayerTableIterator *pIter=NULL;
VERIFY(pLayTab->newIterator(pIter)==Acad::eOk);
pLayTab->close();
for(pIter->start(); !pIter->done(); pIter->step()) {
AcDbLayerTableRecord *pRec=NULL;
if (pIter->getRecord(pRec, AcDb::kForWrite)==Acad::eOk) {
const TCHAR *szName=NULL;
VERIFY(pRec->getName(szName)==Acad::eOk);
if (_tcsicmp(szName, _T("_HOLE"))==0) {
pRec->setName(LAY_BOUNDARY);
} else if (_tcslen(szName)>2 && szName[0]==_T('3') && szName[1]==_T('D')) {
XString sName;
sName << _T("3T");
if (szName[2]!=_T('_'))
sName << _T("_");
sName << &szName[2];
pRec->setName(sName);
}
pRec->close();
}
}
delete pIter;
db.saveAs(sDwgFile);
}
}
}
}
void ExplDwb()
{
ExplDwbArg(0);
}
void ExplWD3d()
{
ExplDwbArg(1);
}
// UpdateDwb
void UpdateDwb()
{
XString sDwbFile;
if (GetFileDia(sDwbFile, 0, _T("DWB"), _T("Select Dwb"))!=RTNORM)
return;
const TCHAR *pszFilter = _T("DWG Files (*.dwg)|*.dwg||");
CFileDialog dlg(TRUE, _T("DWG"), NULL, OFN_ALLOWMULTISELECT|OFN_HIDEREADONLY, pszFilter,
acedGetAcadFrame());
TCHAR strFileName[4056] = _T("");
2026-10-04 00:04:20 +08:00
TCHAR szDlgTitle[] = _T("选择需入库的DWG文件");
// Zyu modify on 100722,支持64位
2026-09-28 15:28:50 +08:00
//int maxChar = 4055, nCode;
int maxChar = 4055;
INT_PTR nCode = IDOK;
dlg.m_ofn.lpstrFile = strFileName;
dlg.m_ofn.nMaxFile = maxChar;
dlg.m_ofn.lpstrTitle = szDlgTitle;
//dlg.m_ofn.lpstrInitialDir = g_szDirName;
if ((nCode=dlg.DoModal())==IDOK) {
POSITION pos = dlg.GetStartPosition();
XDrawingLib dwb(sDwbFile);
while(pos!=NULL) {
CString csPath=dlg.GetNextPathName(pos);
// Add DWB
dwb.Append(csPath);
}
}
}
// Test Command
void ConvertSysLib()
{
XString sFileIndex;
2026-10-04 00:04:20 +08:00
if (GetFileDia(sFileIndex, 0, _T("txt"), _T("系统图库文件"))!=RTNORM)
2026-09-28 15:28:50 +08:00
return;
XPathParser parser(sFileIndex);
XString sLibFile(256), sDwbFile(256), sSlbFile(256);
const TCHAR *szLibFile=_T("TchSys");
sLibFile << parser.m_sDrive << parser.m_sDir << szLibFile << _T(".tk");
sDwbFile << parser.m_sDrive << parser.m_sDir << szLibFile << _T(".DWB");
sSlbFile << parser.m_sDrive << parser.m_sDir << szLibFile << _T(".SLB");
CodeBase db;
if (!FindFile(sLibFile)) {
FieldInfo fields[4];
fields[0] = FieldInfo(_T("kind"), _T('C'), 200);
fields[1] = FieldInfo(_T("item"), _T('C'), 64);
fields[2] = FieldInfo(_T("drawing"), _T('C'), 32);
2026-10-04 00:04:20 +08:00
// Zyu modify on 100721,传入列数
2026-09-28 15:28:50 +08:00
// XDbfTable *pTable = db.Create(sLibFile, fields);
XDbfTable *pTable = db.Create(sLibFile, fields, 4);
pTable->Close();
}
XDbfTable *pTable=db.Open(sLibFile);
if (!pTable)
{
return;
}
ASSERT(pTable);
XDrawingLib dwb(sDwbFile);
XSlideLib slb(sSlbFile);
FILE *fp=_tfopen(sFileIndex, _T("r"));
while(!feof(fp)) {
TCHAR sBuf[256]=_T(""), sDwg[256]=_T(""), sDwbDwg[256]=_T(""), sDesc[256]=_T("");
_fgetts(sBuf, 255, fp);
if (sBuf[0]) {
_stscanf(sBuf, _T("%s%s%s"), sDwg, sDwbDwg, sDesc);
if (sDwg[0] && sDwbDwg[0]) {
XString sDwgPath, sSldPath, sDwbPath, sSlbPath, sDwbName, sDwgName;
if (!SplitLibraryPath(sDwbDwg, sDwbName, sDwgName))
continue;
sDwbPath << parser.m_sDrive << parser.m_sDir << sDwbName << _T(".dwb");
sSlbPath << parser.m_sDrive << parser.m_sDir << sDwbName << _T(".slb");
XDrawingLib dwb1(sDwbPath, _ios::in|_ios::binary);
XSlideLib slb1(sSlbPath, _ios::in|_ios::binary);
int nIndex=0;
if (dwb1.IsExist(sDwgName, &nIndex)) {
XString sTempDwg=GetTempFileName(_T(".dwg"));
if (dwb1.Copy(nIndex, sTempDwg)) {
dwb.Append(sTempDwg, sDwg);
}
}
if (slb1.IsExist(sDwgName, &nIndex)) {
XString sTempSld=GetTempFileName(_T(".sld"));
if (slb1.Copy(nIndex, sTempSld)) {
slb.Append(sTempSld, sDwg);
}
}
if (pTable->MoveTo(_T("drawing"), sDwg, CMP_INSENSITIVE)) {
SET_FIELD(pTable, _T("item"), sDesc);
SET_FIELD(pTable, _T("drawing"), sDwg);
} else {
pTable->AppendBegin();
SET_FIELD(pTable, _T("item"), sDesc);
SET_FIELD(pTable, _T("drawing"), sDwg);
pTable->AppendEnd();
}
}
}
}
fclose(fp);
}
2026-10-04 00:04:20 +08:00
// [2010-3-16 10:46 wubo] 移植到新Geo库
2026-09-28 15:28:50 +08:00
// extern GEOAPI int ConnectPolygon(const XPolygonEx &poly1, const XPolygonEx &poly2, XPolygonEx &res);
void TestSub()
{
Entity ent1;
PickSet ss2(SS_FREE);
RBList mask(RTDXF0, _T("LWPOLYLINE"), 70, 1, NULL);
if (ent1.FilterSelect(_T("\nPoly1:"), mask)==RTNORM &&
SelectEntities(_T("\nPoly2:"), ss2, mask)==RTNORM) {
XPoly2D poly1(ent1);
if (poly1.PathArea()>0.0)
poly1.Reverse();
XPoly p1;
poly1.MapToPolygon1(p1, _AS_SYS_UNIT(g_nCirDeviation));
XPolygonEx q1(p1);
long len=ss2.Length();
for(long i=0L; i<len; i++) {
Entity ent2=ss2[i];
XPoly2D poly2(ent2);
if (poly2.PathArea()<0.0)
poly2.Reverse();
XPoly p2;
poly2.MapToPolygon1(p2, _AS_SYS_UNIT(g_nCirDeviation));
XPolygonEx q2(p2), q3;
ConnectPolygon(q1, q2, q3);
q1=q3;
}
for(i=0; i<q1.Length(); i++) {
XLine(q1.GetVertex(i), q1.GetVertex(i+1)).Make(q1.IsVisible(i)? _T("2") : _T("1"));
}
XTrianglePface lstTris;
if (q1.Trianglize(lstTris, TRUE)==RTNORM) {
lstTris.MakePolyface();
2026-10-04 00:04:20 +08:00
adsout << _T("\n成功的转成面!");
2026-09-28 15:28:50 +08:00
}
}
}
void TestUnion()
{
Entity ent1, ent2;
RBList mask(RTDXF0, _T("LWPOLYLINE"), 70, 1, NULL);
if (ent1.FilterSelect(_T("\nPoly1:"), mask)==RTNORM &&
ent2.FilterSelect(_T("\nPoly2:"), mask)==RTNORM) {
XPoly2D poly1(ent1), poly2(ent2);
if (poly1.PathArea()>0.0)
poly1.Reverse();
if (poly2.PathArea()>0.0)
poly2.Reverse();
XPoly p1, p2;
poly1.MapToPolygon1(p1, _AS_SYS_UNIT(g_nCirDeviation));
poly2.MapToPolygon1(p2, _AS_SYS_UNIT(g_nCirDeviation));
XPolygonEx q1(p1), q2(p2), q3;
ConnectPolygon(q1, q2, q3);
XTrianglePface lstTris;
if (q3.Trianglize(lstTris, TRUE)==RTNORM) {
lstTris.MakePolyface();
2026-10-04 00:04:20 +08:00
adsout << _T("\n成功的转成面!");
2026-09-28 15:28:50 +08:00
}
}
}
void ConvertExtra()
{
2026-10-04 00:04:20 +08:00
const TCHAR *pszDir=_T("g:\\图库\\");
2026-09-28 15:28:50 +08:00
XString sLibFile(256), sDwbFile(256), sSlbFile(256);
2026-10-04 00:04:20 +08:00
const TCHAR *szLibFile=_T("附加图库");
2026-09-28 15:28:50 +08:00
sLibFile << pszDir << szLibFile << _T(".tk");
sDwbFile << pszDir << szLibFile << _T(".DWB");
sSlbFile << pszDir << szLibFile << _T(".SLB");
CodeBase db;
if (!FindFile(sLibFile)) {
FieldInfo fields[4];
fields[0] = FieldInfo(_T("kind"), _T('C'), 200);
fields[1] = FieldInfo(_T("item"), _T('C'), 64);
fields[2] = FieldInfo(_T("drawing"), _T('C'), 32);
2026-10-04 00:04:20 +08:00
// Zyu modify on 100721,传入列数
2026-09-28 15:28:50 +08:00
// XDbfTable *pTable = db.Create(sLibFile, fields);
XDbfTable *pTable = db.Create(sLibFile, fields, 4);
pTable->Close();
}
XStringList lstFiles;
FindFiles(pszDir, _T("*.dwg"), lstFiles, TRUE);
XDbfTable *pTable=db.Open(sLibFile);
if (!pTable)
{
return;
}
ASSERT(pTable);
XDrawingLib dwb(sDwbFile);
XSlideLib slb(sSlbFile);
2026-10-04 00:04:20 +08:00
acedSetStatusBarProgressMeter(_T("正在制作,按ESC中断"), 0, lstFiles.Length());
2026-09-28 15:28:50 +08:00
for(int i=0;i<lstFiles.Length();i++) {
XString sDwgPath, sSldPath, sDrawing;
if (GetNextItem(sDwbFile, sDrawing)!=RTNORM)
break;
if (ads_usrbrk())
break;
if (!(i%5))
acedSetStatusBarProgressMeterPos(i);
XPathParser parser(lstFiles[i]);
sDwgPath << pszDir << parser.m_sDir << parser.m_sFileName << _T(".dwg");
sSldPath << pszDir << parser.m_sDir << parser.m_sFileName << _T(".sld");
dwb.Append(sDwgPath, sDrawing);
if (FindFile(sSldPath)) {
slb.Append(sSldPath, sDrawing);
} else {
ads_command(RTSTR, _T(".INSERT"), RTSTR, (const TCHAR *)sDwgPath, RTSTR, _T("0,0,0"),
RTREAL, 1.0, RTREAL, 1.0, RTREAL, 0.0, RTNONE);
ads_command(RTSTR, _T(".ZOOM"),RTSTR, _T("extent"), RTNONE);
ads_command(RTSTR, _T("HIDE"), RTNONE);
XString xsTempSld=GetTempFileName(_T(".SLD"));
ads_command(RTSTR, _T("MSLIDE"), RTSTR, (const TCHAR *)xsTempSld, RTNONE);
slb.Append(xsTempSld, sDrawing);
Entity ent;
ent.GetLast();
ent.Delete();
_tremove(xsTempSld);
}
XString sKind;
sKind=parser.m_sDir;
2026-10-04 00:04:20 +08:00
// Zyu modify on 100723,消除64位编译警告
2026-09-28 15:28:50 +08:00
//int nChNum=_tcslen(sKind);
int nChNum=(int)_tcslen(sKind);
if(nChNum>0 && sKind[nChNum-1]==_T('\\'))
sKind[nChNum-1]=EOS;
pTable->AppendBegin();
SET_FIELD(pTable, _T("kind"), sKind);
SET_FIELD(pTable, _T("item"), parser.m_sFileName);
SET_FIELD(pTable, _T("drawing"), sDrawing);
pTable->AppendEnd();
}
acedRestoreStatusBar();
}
void OnWhichWall()
{
RBList mask(RTDXF0, _T("TCH_OPENING"), NULL);
Entity ent;
2026-10-04 00:04:20 +08:00
if (SelectEntity(_T("\n选择门窗:"), ent, mask)==RTNORM) {
2026-09-28 15:28:50 +08:00
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbOpening, pWin);
if (pWin) {
AcDbObjectId idWall=pWin->GetWallId();
if (!idWall) {
adsout << _T("NONE");
} else {
Entity ent;
acdbGetAdsName(ent.name, idWall);
TCHAR szHandle[256]=_T("");
ent.GetData(5, szHandle);
adsout << szHandle;
}
}
OPENOBJ_END();
}
}
void HitLine()
{
Entity entLine;
XPoint pt;
RBList rbMask=ads_buildlist(RTDXF0, _T("LINE"), NULL);
if (entLine.FilterSelect(_T("\nSelect a line:"), rbMask)==RTNORM &&
ads_getpoint(NULL, _T("\nPick a point:"), pt)==RTNORM) {
XLine ln(entLine);
pt=Ucs2Wcs(pt);
adsout << _T("\nHit Flag=") << ln.HitTest2d(pt);
}
}
void HitTriangle()
{
Entity entLine;
XPoint pt;
RBList rbMask=ads_buildlist(RTDXF0, _T("POLYLINE,LWPOLYLINE"), NULL);
if (entLine.FilterSelect(_T("\nSelect a triangle:"), rbMask)==RTNORM &&
ads_getpoint(NULL, _T("\nPick a point:"), pt)==RTNORM) {
XPoly2D poly(entLine);
if (poly.Length()!=3)
return;
pt=Ucs2Wcs(pt);
XTriangle tri(*poly[0], *poly[1], *poly[2]);
adsout << _T("\nHit Flag=") << tri.HitTest2d(pt);
}
}
///////////////////////////////////////////////////
void FlatBlockRecord(AcDbObjectId id);
static void SetElev(AcDbEntity *pEnt)
{
if (pEnt->isKindOf(AcDbLine::desc())) {
AcDbLine *pLine=(AcDbLine *)pEnt;
AcGePoint3d ptStart=pLine->startPoint();
AcGePoint3d ptEnd=pLine->endPoint();
ptStart.z=ptEnd.z=0.0;
pLine->setStartPoint(ptStart);
pLine->setEndPoint(ptEnd);
} else if (pEnt->isKindOf(AcDbArc::desc())) {
AcDbArc *pArc=(AcDbArc *)pEnt;
AcGePoint3d ptCen=pArc->center();
ptCen.z=0;
pArc->setCenter(ptCen);
} else if (pEnt->isKindOf(AcDbCircle::desc())) {
AcDbCircle *pCir=(AcDbCircle *)pEnt;
AcGePoint3d ptCen=pCir->center();
ptCen.z=0;
pCir->setCenter(ptCen);
} else if (pEnt->isKindOf(AcDbPolyline::desc())) {
AcDbPolyline *pPolyline=(AcDbPolyline *)pEnt;
pPolyline->setElevation(0.0);
} else if (pEnt->isKindOf(AcDbHatch::desc())) {
AcDbHatch *pHatch=(AcDbHatch *)pEnt;
pHatch->setElevation(0.0);
} else if (pEnt->isKindOf(AcDbBlockReference::desc())) {
//AcDbObjectId id=((AcDbBlockReference*)pEnt)->blockTableRecord();
//FlatBlockRecord(id);
AcDbBlockReference *pInsert=AcDbBlockReference::cast(pEnt);
AcGePoint3d pt=pInsert->position();
pt.z=0;
pInsert->setPosition(pt);
}
}
void FlatBlockRecord(AcDbObjectId id)
{
OPENOBJ_BEGIN(id, AcDb::kForRead, AcDbBlockTableRecord, pMspace);
if (pMspace) {
AcDbBlockTableRecordIterator *pIter=NULL;
VERIFY(pMspace->newIterator(pIter)==Acad::eOk);
for(pIter->start(); !pIter->done(); pIter->step()) {
AcDbEntity *pEnt=NULL;
VERIFY(pIter->getEntity(pEnt, AcDb::kForWrite)==Acad::eOk);
SetElev(pEnt);
pEnt->close();
}
delete pIter;
}
OPENOBJ_END();
}
2026-10-04 00:04:20 +08:00
// 邪门,导致图形发生意想不到的变化
// Append导致index发生变化造成。
2026-09-28 15:28:50 +08:00
void FlatBlock()
{
XString sDwbFile, sTempPath(256);
2026-10-04 00:04:20 +08:00
if (GetFileDia(sDwbFile, 0, _T("DWB"), _T("选择图块包文件"))!=RTNORM)
2026-09-28 15:28:50 +08:00
return;
XDrawingLib dwb(sDwbFile);
GetTempPath(255, sTempPath);
TCHAR cTail=sTempPath[int(_tcslen(sTempPath)-1)];
if (cTail!=_T('\\'))
sTempPath << _T("\\");
sTempPath << _T("FLATDWB\\");
MakeDir(sTempPath);
XStringList lstDwg;
dwb.GetAll(lstDwg);
for(int i=0; i<lstDwg.Length(); i++) {
XString sFile;
sFile << sTempPath << lstDwg[i];
dwb.Copy(i, sFile);
sFile << _T(".dwg");
BOOL bUpdate=FALSE;
{
AcDbDatabase db(false, true);
if (db.readDwgFile(sFile)==Acad::eOk) {
AcDbObjectId idMspace=GetMSpaceId(&db);
FlatBlockRecord(idMspace);
if (db.saveAs(sFile)==Acad::eOk) {
bUpdate=TRUE;
}
}
}
if (bUpdate) {
dwb.Append(sFile);
}
_tremove(sFile);
}
}
void SplitCurve()
{
RBList mask=ads_buildlist(RTDXF0, _T("LWPOLYLINE"), NULL);
Entity ent;
if (SelectEntity(_T("\nSelect polyline:"), ent, mask)!=RTNORM)
return;
XPoint pt1, pt2;
if (ads_getpoint(NULL, _T("\nPoint1: "), pt1)!=RTNORM ||
ads_getpoint(NULL, _T("\nPoint2: "), pt2)!=RTNORM)
return;
pt1=Ucs2Wcs(pt1);
pt2=Ucs2Wcs(pt2);
OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbPolyline, pLine);
if (pLine) {
AcGePoint3dArray points;
points.append(pt1);
points.append(pt2);
AcDbVoidPtrArray entSet;
if (pLine->getSplitCurves(points, entSet)==Acad::eOk) {
pLine->erase();
for(int i=0; i<entSet.length(); i++) {
AcDbEntity *pEnt=(AcDbEntity *)entSet[i];
pEnt->setColorIndex(i+1);
AddToModelSpace(pEnt, Adesk::kTrue);
}
}
}
OPENOBJ_END();
}
void TransMvInsert()
{
Entity ent;
RBList mask=ads_buildlist(RTDXF0, _T("TCH_MVINSERT"), NULL);
if (ent.FilterSelect(_T("\nSelect MV insert: "), mask)==RTNORM) {
AcDbObjectId id2d, id3d;
AcGeMatrix3d mat;
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbMultiViewInsert, pInsert);
id2d=pInsert->GetBlockId(FALSE);
id3d=pInsert->GetBlockId(TRUE);
AcDbBlockReference *pInsert2d=pInsert->NewBlock(FALSE);
AcDbBlockReference *pInsert3d=pInsert->NewBlock(TRUE);
pInsert2d->setScaleFactors(AcGeScale3d(1,1,1));
pInsert3d->setScaleFactors(AcGeScale3d(1,1,1));
pInsert2d->setRotation(0);
pInsert3d->setRotation(0);
TBlockGeomInfo geom2d, geom3d;
geom2d.SetFromInsert(pInsert2d);
geom3d.SetFromInsert(pInsert3d);
geom2d.m_ptCen.z=geom3d.m_ptCen.z=0;
ads_matrix mat1;
geom2d.m_ptCen.GetMoveMatrix(geom3d.m_ptCen, mat1);
mat=AsAcGeMatrix3d(mat1);
delete pInsert2d;
delete pInsert3d;
OPENOBJ_END();
OPENOBJ_BEGIN(id2d, AcDb::kForRead, AcDbBlockTableRecord, pRec);
AcDbBlockTableRecordIterator *pIter=NULL;
if (pRec->newIterator(pIter)==Acad::eOk && pIter) {
for(pIter->start(); !pIter->done(); pIter->step()) {
AcDbEntity *pEnt=NULL;
VERIFY(pIter->getEntity(pEnt, AcDb::kForWrite)==Acad::eOk);
ASSERT(pEnt);
pEnt->transformBy(mat);
pEnt->close();
}
delete pIter;
}
OPENOBJ_END();
ent.Update();
}
}
void UpdateMvLib()
{
TCHAR dir[256]=_T(""), lib3d[256]=_T("");
_tcscpy(dir, g_sAppPath);
TCHAR *p=&dir[_tcslen(dir)-2];
while(*p!=_T('\\') && p!=dir) p--;
if (*p==_T('\\')) *(p+1)=0;
_tcscpy(lib3d, dir);
_tcscat(lib3d, _T("LIB3D\\"));
Entity ent;
RBList mask=ads_buildlist(RTDXF0, _T("TCH_MVINSERT"), NULL);
if (ent.FilterSelect(_T("\nSelect MV insert: "), mask)==RTNORM) {
AcDbObjectId id2d, id3d;
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbMultiViewInsert, pInsert);
id2d=pInsert->GetBlockId(FALSE);
id3d=pInsert->GetBlockId(TRUE);
OPENOBJ_END();
int iFlag=1;
2026-10-04 00:04:20 +08:00
adsout << _T("\n输入更新内容(0x01-更新二维,0x02-更新三维)<") << iFlag << _T(">: ");
2026-09-28 15:28:50 +08:00
if (ads_getint(_T(""), &iFlag)!=RTCAN) {
XString sBlock2d, sBlock3d;
ent.GetData(1, (TCHAR *)sBlock2d);
ent.GetData(2, (TCHAR *)sBlock3d);
if (iFlag&0x01) {
XString sDwb, sDwg;
if (SplitBlockName(sBlock2d, sDwb, sDwg)==Acad::eOk) {
XString sDwbPath, sDwgPath;
sDwbPath << lib3d << sDwb << _T(".dwb");
sDwgPath << lib3d << sDwg << _T(".dwg");
AcDbDatabase *db=NULL;
if (acdbCurDwg()->wblock(db, id2d)==Acad::eOk) {
_tremove(sDwgPath);
db->saveAs(sDwgPath);
delete db;
XDrawingLib dwb(sDwbPath);
dwb.Append(sDwgPath);
_tremove(sDwgPath);
}
}
}
if (iFlag&0x02) {
XString sDwb, sDwg;
if (SplitBlockName(sBlock3d, sDwb, sDwg)==Acad::eOk) {
XString sDwbPath, sDwgPath;
sDwbPath << lib3d << sDwb << _T(".dwb");
sDwgPath << lib3d << sDwg << _T(".dwg");
AcDbDatabase *db=NULL;
if (acdbCurDwg()->wblock(db, id3d)==Acad::eOk) {
_tremove(sDwgPath);
db->saveAs(sDwgPath);
delete db;
XDrawingLib dwb(sDwbPath);
dwb.Append(sDwgPath);
_tremove(sDwgPath);
}
}
}
}
}
}
2026-10-04 00:04:20 +08:00
// 移除acad.exe的有害资源
2026-09-28 15:28:50 +08:00
/*
2026-10-04 00:04:20 +08:00
bool RemoveRT_MANIFEST(const TCHAR* fullPath=_T("acad.exe"),int resId=1)//for ACAD.exe,set resId to 1
2026-09-28 15:28:50 +08:00
{
HANDLE hUpdateRes = BeginUpdateResource(fullPath,FALSE);
if (hUpdateRes == NULL)
return false;
if (!UpdateResource(hUpdateRes,RT_MANIFEST,MAKEINTRESOURCE(resId),
MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),NULL,NULL))
return false;
if (!EndUpdateResource(hUpdateRes, FALSE))
return false;
return true;
}
*/
extern BOOL MakeOUTWALL(PickSet &ssWalls, CString slayname,CString sLineType, double dThickness, int ntypetri, int nBaltype);
extern int DragInputPoly(XPoint ptStart, XPoly2D &poly2dRet, CString strLayer);
extern BOOL GetPLLeftDownPoint(AcDbPolyline *pLwPoly, XPoint &ptLoc);
2026-10-04 00:04:20 +08:00
//建筑轮廓
2026-09-28 15:28:50 +08:00
void BuildOutLine()
{
CBuildOutLineDlg *pDlg = new CBuildOutLineDlg(acedGetAcadFrame());
pDlg->Create(IDD_DIALOG_BUILDOUTLINE);
pDlg->ShowWindow(SW_SHOW);
acedGetAcadDwgView()->SetFocus();
bool bExit = false;
while(1)
{
pDlg->m_bUseEsc = true;
2026-10-04 00:04:20 +08:00
//自动搜索上华墙、柱等实体
2026-09-28 15:28:50 +08:00
if (CBuildOutLineDlg::kSearchAuto ==pDlg->GetDrawType())
{
PickSet ssWalls(SS_FREE);
g_ssPickFirst.Free();
2026-10-04 00:04:20 +08:00
int iRet = SelectEntities(_T("\n请选择构成一完整建筑平面的所有墙柱、门窗(该命令仅限于世界坐标系运行):"), ssWalls,RBList(RTDXF0, _T("TCH_WALL,TCH_CURTAIN_WALL,TCH_OPENING,TCH_BALCONY"), NULL));
2026-09-28 15:28:50 +08:00
if ( iRet == RTNORM)
{
MakeOUTWALL(ssWalls, pDlg->GetLayerName(), pDlg->GetLineType(), pDlg->GetLineWidth(), pDlg->IsFlagTri(), pDlg->IsDrawBalcony());
}
else if (pDlg->m_bUseEsc)
{
break;
}
}
2026-10-04 00:04:20 +08:00
//任意绘制
2026-09-28 15:28:50 +08:00
else if (CBuildOutLineDlg::kAnyDraw ==pDlg->GetDrawType())
{
XPoint ptStart;
2026-10-04 00:04:20 +08:00
int nRet = ads_getpoint(NULL, _T("\n请点取建筑轮廓线起点<退出>:"), ptStart);
2026-09-28 15:28:50 +08:00
XPoly2D poly2dRet;
if (nRet == RTNORM)
{
ptStart = Ucs2Wcs(ptStart);
XPoly2D polyLine;
polyLine.AppendNode(ptStart);
if (RTNORM == DragInputPoly(ptStart, polyLine, pDlg->GetLayerName()))
{
AcDbPolyline *pPLine = new AcDbPolyline;
AssureLayer(pDlg->GetLayerName(), LAYSTAT_UNLOCK);
pPLine->setLayer(pDlg->GetLayerName());
PolyConvert(polyLine, *pPLine);
pPLine->setClosed(Adesk::kTrue);
pPLine->setConstantWidth(pDlg->GetLineWidth());
AcDbObjectId idLineType = InitLineType(pDlg->GetLineType());
pPLine->setLinetype(idLineType);
AcDbObjectId polyId = AddToModelSpace(pPLine, Adesk::kTrue);
ASSERT(!!polyId);
OPENOBJ_BEGIN(polyId, AcDb::kForRead, AcDbEntity, pEnt);
if (pEnt)
pEnt->draw();
OPENOBJ_END();
CPoint ptCursor;
2026-10-04 00:04:20 +08:00
XPoint ptLoc;//获取当前基点
2026-09-28 15:28:50 +08:00
GetPLLeftDownPoint(pPLine, ptLoc);
ASSERT(!!polyId);
OPENOBJ_BEGIN(polyId, AcDb::kForRead, AcDbEntity, pEnt);
if (pEnt)
pEnt->draw();
OPENOBJ_END();
int iRet = 0;
PickSet ss(SS_FREE);
ss += polyId;
ss.IncludeEnd();
iRet = DragPickSet(ss,ptLoc);
if (iRet!=RTNORM)
{
if (iRet == RTCAN )
{
ss.Redraw(1);
ss.Delete();
}
}
}
else
break;
}
else if (pDlg->m_bUseEsc)
break;
}
2026-10-04 00:04:20 +08:00
//拾取参数
2026-09-28 15:28:50 +08:00
else if (CBuildOutLineDlg::kPickData == pDlg->GetDrawType())
{
double dWidth(0);
CString sLayer(_T("")), sLineType(_T(""));
RBList rbMask1(RTDXF0, _T("LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,TCH_*"), NULL);
Entity ent1;
2026-10-04 00:04:20 +08:00
if (SelectEntity(_T("\n请拾取参考对象<返回>:"), ent1, rbMask1) == RTNORM)
2026-09-28 15:28:50 +08:00
{
OPENOBJ_BEGIN(ent1, AcDb::kForRead, AcDbEntity, pEnt);
if (pEnt==NULL)
break;
if (pEnt->isKindOf(AcDbPolyline::desc()))
{
AcDbPolyline *pline = AcDbPolyline::cast(pEnt);
pline->getConstantWidth(dWidth);
}
sLayer = pEnt->layer();
sLineType = pEnt->linetype();
OPENOBJ_END()
pDlg->SetLayerName(sLayer);
pDlg->SetLineType(sLineType);
pDlg->SetLineWidth(dWidth);
}
pDlg->m_bPickMode = FALSE;
pDlg->UpdateData(FALSE);
}
}
if (pDlg)
{
pDlg->DestroyWindow();
delete pDlg;
}
}