Непонятная ситуация.
Если вызвать функцию выбора polyLineSel в команде (triang), в которой создаются файсы, то выбор не происходит, acedSSGet возвращает RTERROR или RTCAN, точнее не проверял. Если вызвать функцию выбора polyLineSel в другой команде, то все работает.
Так же если вызвать команду triang повторно, то создается еще три фейса, поверх предыдущих и выбирается три объекта, хотя фейсов уже 6. Если опять вызвать triang то строиться еще три новых фейса (всего 9) и выбирается 6 старых объектов.
Это не проблема, все программа сама фейсы строить не будет, но интересно, почему так?
Код:
// - PetrPavlovv0_0._triang command (do not rename)
static void PetrPavlovv0_0_triang(void)
{
AcGePoint3d firstPt(10.0, 10.0, 0.0), secondPt(100.0, 40.0, 40.0), lastPt(120.0, 20.0, 60.0);
AcGePoint3d firstPt2(130.0, 50.0, 2.0);
AcGePoint3d firstPt3(180.0, 20.0, 9.0);
create3DFace(secondPt, firstPt2, lastPt);
create3DFace(firstPt2, lastPt, firstPt3);
create3DFace(firstPt, secondPt, lastPt);
AcGePoint3dArray points;
points.append(AcGePoint3d(0.0, 25.0, 0.0));
points.append(AcGePoint3d(80.0, 35.0, 0));
points.append(AcGePoint3d(90.0, 22.0, 0.0));
points.append(AcGePoint3d(120.0, 40.0, 0.0));
points.append(AcGePoint3d(130.0, 15.0, 0.0));
points.append(AcGePoint3d(195.0, 65.0, 0.0));
ads_name ent;
polyLineSel(points, &ent);
acedSSFree(ent);
}
AcDbObjectId Cv0_0App::create3DFace( const AcGePoint3d& firstPt, const AcGePoint3d& secondPt, const AcGePoint3d& lastPt)
{
AcDbFace* pFace = new AcDbFace(firstPt, secondPt, lastPt);
AcDbBlockTable *pBlockTable;
acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable, AcDb::kForRead);
AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
pBlockTable->close();
AcDbObjectId FaceId;
pBlockTableRecord->appendAcDbEntity(FaceId, pFace);
pBlockTableRecord->close();
pFace->close();
return FaceId;
}
void Cv0_0App::polyLineSel( AcGePoint3dArray ptArray, ads_name* name )
{
struct resbuf *pointlist = ptsToResbuf(ptArray);
struct resbuf filter, tmp;
filter.restype = AcDb::kDxfStart;
filter.resval.rstring = _T("3DFACE");
tmp.restype = AcDb::kDxfLayerName;
tmp.resval.rstring = _T("0");
tmp.rbnext = NULL;
filter.rbnext = &tmp;
AcGePoint2d minPolylineBox, maxPolylineBox;
acedCommand(RTSTR, _T("ZOOM"), RTSTR, _T("_W"), RTPOINT, asDblArray(minPolylineBox), RTPOINT, asDblArray(maxPolylineBox), RTNONE);
switch (acedSSGet(_T("_F"),pointlist,NULL,&filter, *name))
{
case RTERROR :
case RTCAN :
{
acutPrintf(_T("\nУпс! Выбор отменен."));
return;
}
break;
}
long len = 0L;
int res = acedSSLength(*name, &len);
if (res != RTNORM || len == 0)
{
acutPrintf(_T("Ух! Объекты не выбраны.\n"));
return;
}
acutPrintf(_T("\nВыбранно %d объектов"), len);
if (pointlist != NULL) acutRelRb(pointlist);
}