Я работаю с библиотекой COM AutoCAD для перемещения блоков, чтобы они не перекрывались. То, как я делаю это прямо сейчас, - это перемещение набора по кругу, пытаясь найти открытое пространство, если никто не нашел, что он расширяет круг.Приложение AutoCAD COM замедляется после определенного количества итераций
Проблема в том, что после шага 387-388 этого цикла он значительно замедляется. Я добавил секундомер, чтобы увидеть, где произошло замедление, но точное местоположение меняется, если я удаляю вещи. Я фактически удалил все, что, как я думал, мог замедлить его, и это тоже не помогло. Итак, на данный момент я действительно не знаю, почему замедляется последовательно происходит.
Вот код, я считаю, что вызывает замедление, дайте мне знать, если вам нужно больше информации:
// Selection set
Int16[] filterCode = new Int16[] { 8 };
object[] filterValue = new object[] { LAYERNAME };
selectionSet.Select(AcSelect.acSelectionSetAll, Type.Missing, Type.Missing, filterCode, filterValue)
// This is how I grab the blocks
listOfEntities = new List<AcadEntity>();
foreach(AcadEntity entity in selectionSet)
{
if(entity.ObjectName.Equals("AcDbBlockReference"))
{
AcadBlockReference block = entity as AcadBlockReference;
if(block.Name.Equals(BLOCKNAME))
listOfEntities.Add(entity);
}
else if(entity.ObjectName.Equals("AcDbText"))
{
listOfEntities.add(entity);
}
}
Затем я использую foreach
цикл для перемещения через лиц в списке и вызвать мою функцию, находит пустое пространство.
if(listOfEntities.Count > 0)
{
_thisDrawing.SendCommand("zoom extent ");
foreach(AcadEntity entity in listOfEntities)
{
FindEmptySpace(entity);
}
}
Вот как я перемещаю блок вокруг, чтобы найти пустое пространство.
radius = (blockHeight > blockWidth ? blockHeight: blockWidth)/10;
for(double distance = radius; ; distance += radius)
{
angle = PIx2/distance;
for (double currentAngle = angle; currentAngle < PIx2; currentAngle += angle)
{
try
{
AcadSelectionSet spaceSelection;
// This ends up being 387-388 every time the slow down starts.
_totalSteps++;
// The new location of the block
newCenterLocation[0] = ((Math.Cos(currentAngle) * distance) + centerLocatoin[0]);
newCenterLocation[1] = ((Math.Sin(currentAngle) * distance) + centerLocation[1]);
// The new bounding box points
newMaxExt[0] = newCenterLocation[0] + (blockWidth/2);
newMaxExt[1] = newCenterLocation[1] + (blockHeight/2);
newMinExt[0] = newMaxExt[0] - blockWidth;
newMinExt[1] = newMinExt[1] - blockHeight;
// Make sure the "SpaceSet" isn't already created.
// I'm not sure if there is an easier way to do this.
try
{
_thisDrawing.SelectionSets.Item("SpaceSet").Delete();
}
catch
{}
spaceSelection = _thisDrawing.SelectionSets.Add("SpaceSet");
block.Move(centerLocation, newCenterLocation);
spaceSelection.Select(AcSelect.acSelectionSetCrossing, newMinExt, newMaxExt, Type.Missing, Type.Missing);
// This is '== 1' because I'm moving the block as well as the selectionset
if(spaceSelection.Count == 1)
{
spaceSelection.Clear();
// Found empty space
return;
}
spaceSelection.Clear();
// Empty space wasn't found at this location, move block back.
// I need to to this because it seems that the Move function moves
// the blocks based on the difference between the two locations.
block.Move(newCenterLoaction, centerLocation);
}
}
}
Я не уверен, если я забываю что-либо сделать. Любая помощь будет оценена по достоинству.
Кроме того, я попытался использовать версии COM версии 2002 и 2013 года, но не уверен, есть ли разница.
UPDATE: Во время работы над проблемой версии я разместил, я получил приложение для работы на 2002. Это никогда не замедляется во время работы на AutoCAD 2002. Это точно такой же код, только различие в библиотеке я использую и номер версии (AutoCAD.Application.15 vs AutoCAD.Application.19). Итак, вот что.
Существует не способ взглянуть на код, как это и делать какие-либо предположения относительно почему столь большое и сложное приложение, как AutoCAD, будет замедляться. Удалите все вызовы interop и убедитесь, что они выполняются последовательно. Я уверен, что так и будет. И вот где это кончается, насколько вы можете это сделать. Только поддержка Autodesk может помочь вам в дальнейшем, хотя я серьезно сомневаюсь, что они ничего не сделают, но отвергают ее как «по дизайну». –
Какая версия автокада вы используете? Какова цель вашей задачи, если вы не возражаете, чтобы я спросил? –
И можете ли вы поместить код, который используете, чтобы перебирать SS в своем посте? –