home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Houseplan Collection
/
HRCD2005.ISO
/
data1.cab
/
Zusatz
/
3DS
/
DATA2.Z
/
TopoColMain.bas
< prev
next >
Wrap
BASIC Source File
|
1999-05-17
|
7KB
|
182 lines
Attribute VB_Name = "TopoColMain"
' ----------------------------------------------------------------------------
' MS Visual Basic Demo-Programm zur Demonstration der ActiveX-FΣhigkeit
' von ArCon(+).
'
' Der abgebildete Code dient lediglich Demonstrationszwecken.
' Es wird keinerlei Garantie fⁿr die Richtigkeit und/oder
' FunktionsfΣhigkeit ⁿbernommen. Bei Fragen wenden Sie sich bitte an
'
' mb-Programme
' Software im Bauwesen GmbH
' Hermannstra▀e 1
' D-31785 Hameln
' e-mail: arcon@mb-software.de
' Internet http://www.mb-software.de
'
' ----------------------------------------------------------------------------
' TopoCol - einfache topologische Analyse und farbliche Hervorhebung
' der Ergebnisse im Konstruktionsmodus
' Demonstriert:
' Setzen der Raum- und Wandschraffuren sowie (Linien-)farben
' Anwendung:
' Sucht in einem geladenenen Projekt (nur im aktuellen Stockwerk)
' nach Au▀enwΣnden und DurchgangsrΣumen. Diese werden farblich
' markiert.
' ----------------------------------------------------------------------------
Option Explicit
' Wir ben÷tigen ein Objekt zur Kommunikation mit der ArCon-EXE,
' hier genⁿgt eine einfache Befehlsverbindung ohne Ereignisverarbeitung:
Dim exe As New ArCon.ArCon
' ----------------------------------------------------------------------------
' Hauptprogramm:
' Erstellt eine Verbindung zu ArCon und druchlΣuft alle WΣnde und
' RΣume im aktuellen Stockwerk. Ruft fⁿr jede Wand/jeden Raum eine
' entsprechende Analysefunktion auf.
Sub Main()
Dim w As ArCon.Wall, r As ArCon.Room
exe.StartMe 0, ""
' Nur wenn wir ein aktuelles Stockwerk haben (also ein Projekt
' geladen ist)
If Not exe.CurrentStory Is Nothing Then
' Alle WΣnde untersuchen
For Each w In exe.CurrentStory.Walls
CheckWall w
Next
' Alle RΣume untersuchen
For Each r In exe.CurrentStory.Rooms
CheckRoom r
Next
End If
exe.EndMe
End Sub
' ----------------------------------------------------------------------------
' Teste, ob diese Wand eine Au▀enwand ist. Wenn ja, markiere
' sie durch eine entsprechende Schraffur und Σndere die Linienfarbe
' der Au▀ensegmente
Sub CheckWall(theWall As ArCon.Wall)
Dim seg As ArCon.WallSegment
Dim found As Boolean
found = False
For Each seg In theWall.WallSegments
If seg.Visible And seg.Room Is Nothing Then
' Dies ist ein Segment an der Au▀enseite des GebΣudes
seg.SetLineColor RGB(0, 0, 255)
found = True
End If
Next
If found Then
' gesamte Wand schraffieren
theWall.SetHatchStyle ACHS_FDIAGONAL, RGB(0, 0, 255)
End If
End Sub
' ----------------------------------------------------------------------------
' Teste, ob dieser Raum ein Durchgangsraum ist. Wenn ja, schraffiere
' ihn.
' Der Einfachheit halber zΣhlen wir einen Raum als Durchgangsraum, wenn
' er Verbindungen (sprich: Tⁿr oder Treppenhaus) zu mindestens zwei
' verschiedenen anderen RΣumen hat
Sub CheckRoom(theRoom As ArCon.Room)
Dim otherRoom As Long ' ID eines anderen Raumes
Dim testRoom As Long
Dim storyBelow As ArCon.Story
Dim st As ArCon.StairCase
Dim r As ArCon.Room
Dim c As ArCon.Contur
Dim seg As ArCon.WallSegment
Dim d As ArCon.Door
Dim x As Single, y As Single
Dim found As Boolean
otherRoom = 0 ' bisher kein anderer Raum gefunden
found = False ' bisher kein Durchgangsraum
' ZunΣchst die Treppen suchen
For Each st In theRoom.Story.Stairs
With st
x = (.X1 + .X2 + .X3) / 3
y = (.Y1 + .Y2 + .Y3) / 3
Set r = theRoom.Story.FindRoom(x, y)
If r Is theRoom Then
' Der Raum hat eine Treppe: es ist ein Durchgangsraum
found = True
Exit For
End If
End With
Next
' Nichts ist einfach in der "wahren Welt": wir mⁿssen auch
' Treppen im Stockwerk unter dem aktuellen betrachten, falls sie
' von unten eine Verbindung zu diesem Raum herstellen
If Not found Then
Set storyBelow = FindStoryBelow(theRoom.Story)
If Not storyBelow Is Nothing Then
For Each st In storyBelow.Stairs
With st
x = (.X1 + .X2 + .X3) / 3
y = (.Y1 + .Y2 + .Y3) / 3
Set r = theRoom.Story.FindRoom(x, y)
If r Is theRoom Then
' Der Raum hat eine Treppe: es ist ein Durchgangsraum
found = True
Exit For
End If
End With
Next
End If
End If
' Falls wir noch nicht sicher sind...
If Not found Then
' alle Tⁿren in allen Konturen untersuchen
For Each c In theRoom.Conturs
For Each seg In c.WallSegments
For Each d In seg.Doors
' Ermittle die ID des Raumes auf der anderen Seite der Tⁿr
If d.LeftSegment.Room Is theRoom Then
testRoom = d.RightSegment.Room.id
ElseIf d.RightSegment.Room Is theRoom Then
testRoom = d.LeftSegment.Room.id
End If
' Entweder dies ist der erste andere Raum oder es mu▀ der
' gleiche sein, ansonsten ist dies ein Durchgangsraum
If otherRoom = 0 Then
otherRoom = testRoom
ElseIf otherRoom <> testRoom Then
found = True
Exit For
End If
Next
If found Then Exit For
Next
If found Then Exit For
Next
End If
If found Then
' Durchgangsraum: schraffieren
theRoom.SetHatchStyle ACHS_BDIAGONAL, RGB(0, 255, 0)
End If
End Sub
' ----------------------------------------------------------------------------
' Finde das Stockwerk unter dem ⁿbergebenen Stockwerk
Function FindStoryBelow(aStory As ArCon.Story) As ArCon.Story
Dim s As ArCon.Story, old As ArCon.Story
Set old = Nothing
For Each s In exe.CurrentBuilding.Stories
If s Is aStory Then Exit For
Set old = s
Next
Set FindStoryBelow = old
End Function