2013-09-23 2 views
0

Я работаю с библиотекой 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). Итак, вот что.

+0

Существует не способ взглянуть на код, как это и делать какие-либо предположения относительно почему столь большое и сложное приложение, как AutoCAD, будет замедляться. Удалите все вызовы interop и убедитесь, что они выполняются последовательно. Я уверен, что так и будет. И вот где это кончается, насколько вы можете это сделать. Только поддержка Autodesk может помочь вам в дальнейшем, хотя я серьезно сомневаюсь, что они ничего не сделают, но отвергают ее как «по дизайну». –

+0

Какая версия автокада вы используете? Какова цель вашей задачи, если вы не возражаете, чтобы я спросил? –

+0

И можете ли вы поместить код, который используете, чтобы перебирать SS в своем посте? –

ответ

0

Один совет, а не использовать SendCommand, используйте это для масштабирования экстента (от AutoCAD .NET помощь разработчику):

// Zoom to the extents of the current space 
Zoom(new Point3d(), new Point3d(), new Point3d(), 1.01075); 
+0

Поскольку я использую COM-интерфейс, я не думаю, что у меня есть доступ к этой точной команде Zoom. Вместо этого я попытался использовать метод _acadApp.ZoomExtents(), но он просто генерирует исключение без какой-либо информации. – Natzely

Смежные вопросы