É, 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.015Veja 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:
- 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).
- Depois com a API NET, eu defino o valor numérico do "ACMan"
- 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
C3DRENESGAh, como ninguem consegiu, está encerrada a promoção, hehehe