-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathRePathLinksPostUpgrade.py
More file actions
272 lines (245 loc) · 13.6 KB
/
RePathLinksPostUpgrade.py
File metadata and controls
272 lines (245 loc) · 13.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
#==============================================================#
# _____ __
# \_ \__ _ _ __ \ \ __ _ _ __ ___ ___ ___
# / /\/ _` | '_ \ \ \/ _` | '_ ` _ \ / _ \/ __|
# /\/ /_| (_| | | | | /\_/ / (_| | | | | | | __/\__ \
# \____/ \__,_|_| |_| \___/ \__,_|_| |_| |_|\___||___/
#
# Written: December 2018
#
# Script to automate re-linking Revit and CAD Links into
# newly upgraded models to the new 003 Multiplex folder
# structure
#
#==============================================================#
import os
projfilesfolder = r'X:\003 - Multiplex\Design\BIM\_Revit\1.0 Project Files\1.0 QQT'
sitefilesfolder = r'X:\003 - Multiplex\Design\BIM\_Revit\1.0 Project Files\2.0 Site'
areafilesfolder = r'X:\003 - Multiplex\Design\BIM\_Revit\1.0 Project Files\4.0 Areas'
BVNProjfiles = {
'AR-MOD-XX-XX-000': os.path.join(sitefilesfolder,'AR-MOD-XX-XX-000-RVT - Model Management.rvt'),
'AR-MOD-XX-XX-001': os.path.join(sitefilesfolder,'AR-MOD-XX-XX-001-RVT - Site.rvt'),
'AR-MOD-XX-XX-002': os.path.join(projfilesfolder,'AR-MOD-XX-XX-002-RVT - Structure.rvt'),
'AR-MOD-XX-XX-003': os.path.join(projfilesfolder,'AR-MOD-XX-XX-003-RVT - Crown Louvers.rvt'),
'AR-MOD-XX-XX-004': os.path.join(projfilesfolder,'AR-MOD-XX-XX-004-RVT - Facade Tower.rvt'),
'AR-MOD-XX-XX-005': os.path.join(projfilesfolder,'AR-MOD-XX-XX-005-RVT - Basement & Podium.rvt'),
'AR-MOD-XX-XX-006': os.path.join(projfilesfolder,'AR-MOD-XX-XX-006-RVT - Interior Tower.rvt'),
'AR-MOD-XX-XX-009': os.path.join(projfilesfolder,'AR-MOD-XX-XX-009-RVT - MEP Place Holders.rvt'),
'AR-MOD-XX-XX-010': os.path.join(projfilesfolder,'AR-MOD-XX-XX-010-RVT - Master Grid.rvt'),
'AR-MOD-XX-XX-015': os.path.join(sitefilesfolder,'AR-MOD-XX-XX-015-RVT - Clearance Zones.rvt'),
'AR-MOD-XX-XX-020': os.path.join(sitefilesfolder,'AR-MOD-XX-XX-020-RVT - DCP Massing.rvt'),
'AR-MOD-XX-XX-025': os.path.join(sitefilesfolder,'AR-MOD-XX-XX-025-RVT - 33 Alfred St.rvt'),
'AR-MOD-XX-XX-800': os.path.join(sitefilesfolder,'AR-MOD-XX-XX-800-RVT - MPX Site.rvt'),
'AR-MOD-XX-XX-900': os.path.join(sitefilesfolder,'AR-MOD-XX-XX-900-RVT - Enscape 3D.rvt'),
'AR-MOD-XX-XX-999': os.path.join(areafilesfolder,'AR-MOD-XX-XX-999-RVT - Area Analysis Model.rvt')
}
ACONEXProjFiles = {
#ASPECT
'LA-MOD-XX-XX-001': r'X:\003 - Multiplex\Design\BIM\_Revit\8.0 Revit Links\1.0 MPX\ASPECT\LA-MOD-XX-XX-001-RVT-17 - Landscape.rvt', # Up to date for XMAS
#AXIS
'AXS-HY-MOD-XX-001': r'X:\003 - Multiplex\Design\BIM\_Revit\8.0 Revit Links\1.0 MPX\AXIS\AXS-HY-MOD-XX-001-RVT-27 - Hydraulic Services.rvt', # Up to date for XMAS
#BG&E
'ST-MOD-XX-XX-001': r'X:\003 - Multiplex\Design\BIM\_Revit\8.0 Revit Links\1.0 MPX\BG&E\001 - ST-MOD-XX-XX-001-RVT - PODIUM\ST-MOD-XX-XX-001-RVT-69 - PODIUM.rvt', # Up to date for XMAS
'ST-MOD-XX-XX-002': r'X:\003 - Multiplex\Design\BIM\_Revit\8.0 Revit Links\1.0 MPX\BG&E\002 - ST-MOD-XX-XX-002-RVT - TOWER\ST-MOD-XX-XX-002-RVT-72 - TOWER.rvt', # Up to date for XMAS
'ST-MOD-XX-XX-003': r'X:\003 - Multiplex\Design\BIM\_Revit\8.0 Revit Links\1.0 MPX\BG&E\003 - ST-MOD-XX-XX-003-RVT - EXISTING\ST-MOD-XX-XX-003-RVT-63 - EXISTING.rvt', # Up to date for XMAS
'ST-MOD-XX-XX-004': r'X:\003 - Multiplex\Design\BIM\_Revit\8.0 Revit Links\1.0 MPX\BG&E\004 - ST-MOD-XX-XX-004-RVT - 33A ALFRED\ST-MOD-XX-XX-004-RVT-31 - 33A ALFRED.rvt', # Up to date for XMAS
'ST-MOD-XX-XX-005': r'X:\003 - Multiplex\Design\BIM\_Revit\8.0 Revit Links\1.0 MPX\BG&E\005 - ST-MOD-XX-XX-005-RVT - INFILL\ST-MOD-XX-XX-005-RVT-17 - INFILL.rvt', # Up to date for XMAS
'ST-MOD-XX-XX-007': r'X:\003 - Multiplex\Design\BIM\_Revit\8.0 Revit Links\1.0 MPX\BG&E\007 - ST-MOD-XX-XX-007-RVT - CROWN\ST-MOD-XX-XX-007-RVT-09 - CROWN.rvt', # Up to date for XMAS
#ECJV
'ECJ-ME-MOD-XX-001': r'X:\003 - Multiplex\Design\BIM\_Revit\8.0 Revit Links\1.0 MPX\ECJV\ECJ-ME-MOD-XX-001-RVT-31 - Mechanical Services.rvt', # Up to date for XMAS
#MPX
'MPX-PM-MOD-XX-001': r'X:\003 - Multiplex\Design\BIM\_Revit\8.0 Revit Links\1.0 MPX\MPX\MPX-PM-MOD-XX-001-RVT-02 - Crane Place Holders.rvt', # Up to date for XMAS
#PFPS
'PFS-FS-MOD-XX-001': r'X:\003 - Multiplex\Design\BIM\_Revit\8.0 Revit Links\1.0 MPX\PFPS\001 - PFS-FS-MOD-XX-001\PFS-FS-MOD-XX-001-RVT-30 - Sprinkler Layout.rvt', # Up to date for XMAS
'PFS-FS-MOD-XX-002': r'X:\003 - Multiplex\Design\BIM\_Revit\8.0 Revit Links\1.0 MPX\PFPS\002 - PFS-FS-MOD-XX-002\PFS-FS-MOD-XX-002-RVT-30 - Fire Hydrant Layout.rvt', # Up to date for XMAS
'PFS-FD-MOD-XX-003': r'X:\003 - Multiplex\Design\BIM\_Revit\8.0 Revit Links\1.0 MPX\PFPS\003 - PFS-FD-MOD-XX-003\PFS-FD-MOD-XX-003-RVT-30 - Fire Detection & EWIS.rvt', # Up to date for XMAS
'PFS-FS-MOD-XX-004': r'X:\003 - Multiplex\Design\BIM\_Revit\8.0 Revit Links\1.0 MPX\PFPS\004 - PFS-FS-MOD-XX-004\PFS-FS-MOD-XX-004-RVT-02 - Temporary Fire.rvt', # Up to date for XMAS
#STAR
'STA-EL-MOD-XX-001': r'X:\003 - Multiplex\Design\BIM\_Revit\8.0 Revit Links\1.0 MPX\STAR\STA-EL-MOD-XX-001-RVT-29 - ELECTRICAL SERVICES.rvt', # Up to date for XMAS
#WEBB
'ASP3-MOD-XX-XX-001': r'X:\003 - Multiplex\Design\BIM\_Revit\8.0 Revit Links\1.0 MPX\WEBB\ASP3-MOD-XX-XX-001-RVT-28 - 50 BRIDGE SUBSTATION MODEL.rvt', # Up to date for XMAS
#DRS
'ID-MOD-XX-XX-001': r'X:\003 - Multiplex\Design\BIM\_Revit\8.0 Revit Links\2.0 AMPC\DRS\ID-MOD-XX-XX-001-RVT-05-SD_Lobby and Terrace.rvt', # Up to date for XMAS
'ID-MOD-XX-XX-002': r'X:\003 - Multiplex\Design\BIM\_Revit\8.0 Revit Links\2.0 AMPC\DRS\ID-MOD-XX-XX-002-RVT-01-SD_The Club lvl 02-03 (2017-03-21).rvt' # Up to date for XMAS
}
otherProjLinks = {
#BVN
'Site Context.rvt': r'X:\003 - Multiplex\Design\BIM\_Revit\8.0 Revit Links\1.0 MPX\BVN\Site Context\Site Context.rvt',
'33 Alfred Interface.rvt': r'X:\003 - Multiplex\Design\BIM\_Revit\4.0 CAD Links\1.0 MPX\BVN\33 Alfred Interface.rvt',
#AAM
'SU-MOD-XX-XX-001 - AAM Survey.rvt': r'X:\003 - Multiplex\Design\BIM\_Revit\4.0 CAD Links\1.0 MPX\AAM\SU-MOD-XX-XX-001 - AAM Survey.rvt',
#AvroKO
'AvroKO - CAD Links.rvt': r'X:\003 - Multiplex\Design\BIM\_Revit\4.0 CAD Links\2.0 AMPC\AvroKO\AvroKO - CAD Links.rvt',
#WEBB
'WEBB Substations CAD.rvt': r'X:\003 - Multiplex\Design\BIM\_Revit\4.0 CAD Links\1.0 MPX\WEBB\ASP3-MOD-XX-XX-001-RVT-28 - 50 BRIDGE SUBSTATION MODEL.rvt',
#Van der Meer
'SSE-ST-MOD - Levels B05 - L02.rvt': r'X:\003 - Multiplex\Design\BIM\_Revit\8.0 Revit Links\1.0 MPX\VANDERMEER\001 - Levels B5 - 02\SSE-ST-MOD - Levels B05 - L02.rvt', # Up to date for XMAS
'SSE-ST-MOD - Levels L02 - L06.rvt': r'X:\003 - Multiplex\Design\BIM\_Revit\8.0 Revit Links\1.0 MPX\VANDERMEER\002 - Levels 02 - 06\SSE-ST-MOD - Levels L02 - L06.rvt', # Up to date for XMAS
'SSE-ST-MOD - Levels L07 - L14.rvt': r'X:\003 - Multiplex\Design\BIM\_Revit\8.0 Revit Links\1.0 MPX\VANDERMEER\003 - Levels 07 - 14\SSE-ST-MOD - Levels L07 - L14.rvt', # Up to date for XMAS
'SSE-ST-MOD - Levels L15 - L20.rvt': r'X:\003 - Multiplex\Design\BIM\_Revit\8.0 Revit Links\1.0 MPX\VANDERMEER\004 - Levels 15 - 20\SSE-ST-MOD - Levels L15 - L20.rvt', # Up to date for XMAS
'SSE-ST-MOD - Levels L21 - L27.rvt': r'X:\003 - Multiplex\Design\BIM\_Revit\8.0 Revit Links\1.0 MPX\VANDERMEER\004 - Levels 21 - 27\SSE-ST-MOD - Levels L21 - L27.rvt', # Up to date for XMAS
#LTS
'LTS Survey Plans.rvt': r'X:\003 - Multiplex\Design\BIM\_Revit\4.0 CAD Links\1.0 MPX\LTS\LTS Survey Plans\LTS Survey Plans.rvt',
'LTS Survey South Stairs.rvt': r'X:\003 - Multiplex\Design\BIM\_Revit\4.0 CAD Links\1.0 MPX\LTS\LTS South Stair\LTS Survey South Stairs.rvt',
'LTS SOUTH STAIR SURVEY.rvt': r'X:\003 - Multiplex\Design\BIM\_Revit\4.0 CAD Links\1.0 MPX\LTS\LTS South Stair\LTS Survey South Stairs.rvt',
#DRS CAD
'DRS - CAD Links.rvt': r'X:\003 - Multiplex\Design\BIM\_Revit\4.0 CAD Links\2.0 AMPC\DRS\DRS - CAD Links.rvt',
#ASPECT
'ASPECT Site Background.rvt': r'X:\003 - Multiplex\Design\BIM\_Revit\4.0 CAD Links\1.0 MPX\ASPECT\Site Background\ASPECT Site Background.rvt'
}
#'': r'',
#------------------------------------------------------------------------#
def GetLinkName(aLink):
#return [x.strip() for x in Element.Name.GetValue(aLink).split(':')]
return Element.Name.GetValue(aLink)
#------------------------------------------------------------------------#
def LinkAlreadyPathed(aLink, thePath):
result = False
#Grab the Model Path of the Link
er = aLink.GetExternalFileReference()
mp = er.GetPath()
#Convert it so we can read it
path = ModelPathUtils.ConvertModelPathToUserVisiblePath(mp)
#This will be a UNC path so convert it to the X: drive path
xpath = os.path.splitunc(path)[1].replace('\\13\\s1309002.yel','X:')
#Check if they point to the same file
if xpath == thePath:
result = True
return result
#------------------------------------------------------------------------#
def GetAllLinks():
theLinks = (
FilteredElementCollector(doc)
.OfCategory(BuiltInCategory.OST_RvtLinks)
#Only Link Types, NOT a Nested Link
.Where(lambda link: (RevitLinkType == type(link)) and not(link.IsNestedLink))
)
return theLinks.ToList()
#------------------------------------------------------------------------#
def RePathBVNModel(aLink):
global BVNProjfiles
linkName = GetLinkName(aLink)
#Grab the first 16 (0-15) characters of the filename
keyval = linkName[:16]
#Get the New Path from the Dictionary above
if keyval in BVNProjfiles.Keys:
newPath = BVNProjfiles[keyval]
return RePathLinks(aLink, newPath)
else:
print 'Key Not Found: ' + keyval
return False
#------------------------------------------------------------------------#
def GetLatestRevisionFromFolder(fileID, folderpath):
# list of Revit files in the folder that match
# both the start of the filename and end with .rvt
filenames = [fn for fn in os.listdir(folderpath)
if fn.startswith(fileID)]
highest = 0
#print folderpath
#If more than one file... loop through and find highest revision
for afile in filenames:
num = GetRevNumberFromFileName(afile)
if num > highest:
highest = num
theFile = afile
#Return an updated File Path of a higher Revision
return (folderpath,theFile)
#------------------------------------------------------------------------#
def RePathConsSubModel(aLink):
global ACONEXProjFiles
linkName = GetLinkName(aLink)
#Grab the first 16/17 characters of the filename up to but not
#including the "-RVT"
keyval = linkName[:linkName.find('-RVT')]
try:
#Get the New Path from the Dictionary above
newPath = ACONEXProjFiles[keyval]
#Find the latest Revision in the new folder <-------------<<< To Do
#
#print 'newPath: ' + newPath
#latest = GetLatestRevisionFromFolder(fileID, newPath)
#print '+-------+' + latest
#Rebuild the path
#newlink = '\\'.join(latest)
if newPath:
return RePathLinks(aLink, newPath)
except Exception as e:
print 'Unable to Re-Path: ' + linkName
return False
#------------------------------------------------------------------------#
def RePathGeneralModel(aLink):
global otherProjLinks
linkName = GetLinkName(aLink)
#In this case use the whole filename as the dict Key
try:
newPath = otherProjLinks[linkName]
if newPath:
return RePathLinks(aLink, newPath)
except Exception as e:
print 'Unable to Re-Path: ' + linkName
return False
#------------------------------------------------------------------------#
def RePathLinks(aLink, newPath):
# Check to make sure that the file needs repathing first
if LinkAlreadyPathed(aLink, newPath):
print 'ALREADY CURRENT: ' + GetLinkName(aLink)
else:
modelpath = ModelPathUtils.ConvertUserVisiblePathToModelPath(newPath)
try:
# Re-Path the file
reloadResults = aLink.LoadFrom(modelpath, WorksetConfiguration())
return True
except Exception as e:
print 'Error Repathing ' + GetLinkName(aLink)
print newPath
print e.message
print '-' * 75
return False
#------------------------------------------------------------------------#
def GetLinkFolderPath(aLink):
thePath = ''
#Get the External Reference
er = aLink.GetExternalFileReference()
#Make sure it isn't Null
if not(er):
print GetLinkName(aLink)
else:
#Get the Model Path
mp = er.GetPath()
#Convert the Model Path to a human readable format
#Also convert relative paths to absolute paths
thePath = os.path.dirname(os.path.abspath(ModelPathUtils.ConvertModelPathToUserVisiblePath(mp)))
return thePath
#------------------------------------------------------------------------#
def main():
#Get a List of the LinkType Elements in the model
theLinks = GetAllLinks()
for aLink in theLinks:
linkName = GetLinkName(aLink)
# If We Have a BVN Project File with No Revision Number
if '-RVT - ' in linkName:
#print linkName + ' is a BVN Local Model'
if RePathBVNModel(aLink):
print 'UPDATED: ' + linkName
else:
print 'Error updating: ' + linkName
else:
# If We have a consultant or Subcontractor model with a revision Number
if '-RVT-' in linkName:
#print linkName + ' is a Consultant or Subcontractor Model'
if RePathConsSubModel(aLink):
print 'UPDATED: ' + linkName
else:
print 'Error updating: ' + linkName
else:
#We must have a non revision Controlled General Link File
#print linkName + ' is a General Link with No Revision'
if RePathGeneralModel(aLink):
print 'UPDATED: ' + linkName
else:
print 'Error updating: ' + linkName
print ' +------------------------------------+'
print ' | >>---> C O M P L E T E <---<< |'
print ' +------------------------------------+'
#------------------------------------------------------------------------#
if __name__ == '__main__': main()