2015-06-16 2 views
2

Я пытаюсь написать метод для изменения существующего блока в чертеже AutoCAD. В этом случае я хочу изменить длину блока, изменив его масштабные коэффициенты. Метод, который я написал, выполнит это, удалив старый блок и создав новый с новыми желаемыми масштабными коэффициентами.Программно получить расположение блока в AutoCAD с его ObjectId

 private static ObjectId _adjustCapPlate(ObjectId capPlateID, bool isHorizontal, Distance left = null, Distance right = null) 
     { 
      BlockReference capPlate = EntityMethods.GetBlockById(capPlateID); //Getting the block to be replaced 
      Scale3d oldScales = capPlate.ScaleFactors; //Getting the scales of the old block 
      Point3d originalLocation = capPlate.Location; // ToDo: Replace capPlate.Location with code that will return the coordinates of the insertion point of the block 
      EntityMethods.DeleteBlockFromDrawingWithId(capPlate.Id); //Deleting the old block 
      //Using specified splice plate length if method does not specify something else 
      if (left == null) 
      { 
       left = new Distance(SettingsController.SplicePlateLength/2); 
      } 
      if (right == null) 
      { 
       right = new Distance(SettingsController.SplicePlateLength); 
      } 

      Distance newXScale, newYScale, newZScale; 
      Point3d newLocation; 

      if (isHorizontal) //If wall is oriented horizontally 
      { 
       newXScale = new Distance(DistanceType.Inch, oldScales.X - right.Inches); 
       newYScale = new Distance(DistanceType.Inch, oldScales.Y); 
       newLocation = new Point3d(originalLocation.X + left.Inches, originalLocation.Y, originalLocation.Z); 
      } 
      else 
      { 
       newXScale = new Distance(DistanceType.Inch, oldScales.X); 
       newYScale = new Distance(DistanceType.Inch, oldScales.Y - right.Inches); 
       newLocation = new Point3d(originalLocation.X, originalLocation.Y + left.Inches, originalLocation.Z); 
      } 
      newZScale = new Distance(DistanceType.Inch, oldScales.Z); 

      BlockReference newCapPlate = EntityMethods.InsertBlock("member", newLocation, "0", null, newXScale, newYScale, newZScale); 
     } 

Все, что мне нужно сделать этот метод, чтобы работать, чтобы заменить capPlate.Location с чем-то, что будет получить XYZ существующего блока координат в AutoCAD чертежа. Кажется смешным, что нет очевидного способа получить программные коды блока.

Я не буду принимать ответы, которые меняют мой подход. Это нужно сделать, удалив старый блок и заменив его, вставив новый блок с новыми свойствами, где был старый блок.

+0

Это ['BlockReference.Position'] (http://through-the-interface.typepad.com/through_the_interface/2015/05/jigging-an-autocad-block-with-attributes-using-net-redux .html)? – dbc

+0

Что именно вам нужно - расположение точки вставки, верхняя левая точка описанного прямоугольника вокруг блока или другой точки? –

ответ

3

Вместо использования capPlate.Location используйте capPlate.Position, и вы должны получить желаемое поведение.

+0

Wow thats wicked очевидно сейчас. благодаря! –

+0

Да, API смешной и непоследовательный. в некоторых местах вам нужно место в других местах, где вам нужно место. это противоречиво и ограничивает полиморфное программирование – BKSpurgeon