Coeficiente de manning e NET API

É, parece que não teve interessados neste post, mas tudo bem...

O problema consistia em definir as propriedades de tubos e estruturas (as pipenetwork do civil 3d). Propriedades como o Coeficiente de Manning via API do Civil 3D...

o interessante que no 2008 e 2009 a api COM dá conta disso na boa, por exemplo:

Sub DefManning()
Dim tubo As AeccPipe
ThisDrawing.Utility.GetEntity tubo, pt, "Selecione um tubo"
tubo.PartDataRecord.Find("ACMan").Tag = 0.015
MsgBox tubo.PartDataRecord.Find("ACMan").Tag
End Sub

Mas no 2010 ".Tag" é read only... é... que beleza né? Obrigado autodesk!!! foi muito legal da sua parte isso!!

Bem, Bem, mas o 2010 tem API .NET!!! Opa, Isso sim!!!

Mas... ela não faz tudo o que a API COM faz, e algumas coisas ainda faz errado...
Em fim, em .NET eu posso fazer:
tubo.PartData.GetDataFieldBy("ACMan").Value = 0.015

Veja completo...

Imports Autodesk.Civil.PipeNetwork.DatabaseServices
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Microsoft.VisualBasic
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Runtime

Public Module c3d2010
_
Public Sub test()
Dim doc As Document = Application.DocumentManager.MdiActiveDocument
Dim ed As Editor = doc.Editor
Dim ts As Transaction = doc.Database.TransactionManager.StartTransaction()

Dim pipeid As ObjectId = ed.GetEntity( _
New PromptEntityOptions(vbNewLine & "Select Pipe:")) _
.ObjectId

Dim fieldname As String = ed.GetString( _
New PromptStringOptions(vbNewLine & "tag:")) _
.StringResult

Dim value As Double = ed.GetDouble( _
New PromptDoubleOptions(vbNewLine & "value:")) _
.Value

Dim tubo As Pipe = ts.GetObject(pipeid, _
Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite)

Dim pf As PartDataField = tubo.PartData.GetDataFieldBy(fieldname)
Dim oldval As Double = pf.Value

pf.Value = value

ts.Commit()

ed.WriteMessage(vbNewLine & "New=" & pf.Value & _
vbNewLine & "Old=" & oldval & _
vbNewLine & "real value=" & _
tubo.PartData.GetDataFieldBy(fieldname).Value)
End Sub

End Module


Sim, posso!!! mas não funciona!!!!
Huahuahuahuahuahuahua!!!

Após muito quebrar a cabeça, aqui e aqui, usando a ideia de algumas pessoas, e fazendo uns testes, acendendo uma vela, e fazendo um despacho na esquina, descobri que era possível alterar o valor do coeficiente de manning ( e de qualquer outra propriedade ) se esta tivesse uma unidade de medida.

Mas .Units na API NET é read only, certo... na API COM é read-write... vai entender...

então olha só o tamanho da lambança que tive de fazer:

Veja completo...

Imports Autodesk.Civil.PipeNetwork.DatabaseServices
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Microsoft.VisualBasic
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Runtime

Public Module c3d2010
_
Public Sub test()
Dim NEW_UNITS As String
Dim civildoc As CivilDocument = CivilApplication.ActiveDocument
If civildoc.Settings.DrawingSettings.UnitZoneSettings.DrawingUnits = _
Autodesk.Civil.Settings.DrawingUnitType.Meters Then
NEW_UNITS = "m"
Else
NEW_UNITS = "ft"
End If

Dim acaddoc As Document = Application.DocumentManager.MdiActiveDocument
Dim ed As Editor = acaddoc.Editor
Dim ts As Transaction = acaddoc.Database.TransactionManager.StartTransaction()

Dim pipeid As ObjectId = ed.GetEntity( _
New PromptEntityOptions(vbNewLine & "Select Pipe:")) _
.ObjectId

Dim tuboNET As Pipe = ts.GetObject(pipeid, _
Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite)

Dim tuboCOM As AeccPipe = tuboNET.AcadObject

Dim PF_COM As AeccPartDataField = tuboCOM.PartDataRecord.Find("ACMan")
Dim OLD_UNITS As String = PF_COM.Units
PF_COM.Units = NEW_UNITS

Dim PR As PartDataRecord = tuboNET.PartData
Dim PF_NET As PartDataField = PR.GetDataFieldBy("ACMan")
PF_NET.Value = 0.015
tuboNET.PartData = PR
PF_COM.Units = OLD_UNITS
End Sub

End Module


É um mix de uso da API COM e API NET:
  1. Com a api COM eu defino temporariamente a unidade de medida da propriedade "ACMan" para metros ou pés (veja que se o desenho estiver em pés, e eu definir como metros o ACMan, vai haver uma conversão de valor e vai dar errado).

  2. Depois com a API NET, eu defino o valor numérico do "ACMan"

  3. Por fim, redefino a unidade de medida de "ACMan" com a API COM



Xunxo legal né?
A solução inicial você pode ver no forum da autodesk, aqui, você pode ver o mesmo (obrigado por postar os créditos)

Isso tudo aí, estou usando no C3DRENESG

Ah, como ninguem consegiu, está encerrada a promoção, hehehe

2 comentários:

  1. I added a credit to the comments of the post, sorry about that.

    ResponderExcluir
  2. Nice brief and this mail helped me alot in my college assignement. Thanks you seeking your information.

    ResponderExcluir