Добрый день коллеги.
Есть вот такая замечательная функция (упрощенная для наглядности)
работает как надо, но при больших объемах данных (например есть чертеж с ~8000 линий) , начинает жрать РАМ. причем потом не отпускает эго.
У меня тут косяк какой то или ОС злая и фрагментирует память так что потом отпустить не может?
нашел такую ссылку, нзн связано ли.
https://adndevblog.typepad.com/autocad/2012/07/problem-with-autocads-memory-usage.htmlВозможно функцию можно как то опримизировать чтобы не перебирать всё подряд?
Назначение функции перебрать все пересечения линий, и вставить блок с маской в точке пересечения
inline void addCrossingsAfterExplodeTest(AcDbObjectIdArray modified)
{
AcDbObjectIdArray idArray;
for (int i = 0; i < modified.length(); i++)
{
if (getType(modified[i]) != PIPE_TYPE)
continue;
if (!idArray.contains(modified[i]))
idArray.append(modified[i]);
}
for (int i = 0; i < idArray.length(); i++)
{
for (int j = i; j < idArray.length(); j++)
{
AcGePoint3dArray crossPoints;
AcDbObjectId tstId = idArray[j];
if (idArray[i] == tstId)
continue;
AcDbObjectPointer<AcDbLine> lin1(tstId, AcDb::kForRead);
AcDbObjectPointer<AcDbLine> lin2(idArray[i], AcDb::kForRead);
if (lin1.openStatus() != Acad::eOk || lin2.openStatus() != Acad::eOk)
continue;
if (lin1->intersectWith(lin2, AcDb::kOnBothOperands, crossPoints) != Acad::eOk)
continue;
CString lr1 = lin1->layer();
CString lr2 = lin2->layer();
AcGePoint3d l1s = lin1->startPoint();
AcGePoint3d l1e = lin1->endPoint();
AcGePoint3d l2s = lin2->startPoint();
AcGePoint3d l2e = lin2->endPoint();
lin1->close();
lin2->close();
}
}
}
пробовал этот код на Autocad 2016 и 2018 64-бит Eng, Win10