openstudio-extension 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/openstudio/extension/core/CreateResults.rb +178 -1
- data/lib/openstudio/extension/core/os_lib_geometry.rb +255 -77
- data/lib/openstudio/extension/core/os_lib_model_generation.rb +2521 -83
- data/lib/openstudio/extension/core/os_lib_reporting.rb +133 -30
- data/lib/openstudio/extension/version.rb +1 -1
- metadata +2 -3
- data/lib/openstudio/extension/core/os_lib_cofee.rb +0 -259
@@ -327,7 +327,8 @@ module OsLib_Geometry
|
|
327
327
|
end
|
328
328
|
|
329
329
|
# sort array by floor area, this hash will be altered to reduce floor area for each space type to 0
|
330
|
-
space_types_running_count = space_types.sort_by { |k, v| v[:floor_area] }
|
330
|
+
#space_types_running_count = space_types.sort_by { |k, v| v[:floor_area] }
|
331
|
+
space_types_running_count = space_types
|
331
332
|
|
332
333
|
# array entry for each story
|
333
334
|
footprints = []
|
@@ -354,8 +355,10 @@ module OsLib_Geometry
|
|
354
355
|
|
355
356
|
space_types_running_count.each do |space_type, space_type_hash|
|
356
357
|
# next if floor area is full or space type is empty
|
357
|
-
|
358
|
-
|
358
|
+
|
359
|
+
tol_value = 0.0001
|
360
|
+
next if current_footprint_area + tol_value >= target_footprint_area
|
361
|
+
next if space_type_hash[:floor_area] <= tol_value
|
359
362
|
|
360
363
|
# special test for when total floor area is smaller than valid_bar_area_min, just make bar smaller that valid min and warn user
|
361
364
|
if target_per_space_type[space_type] < valid_bar_area_min
|
@@ -367,20 +370,18 @@ module OsLib_Geometry
|
|
367
370
|
|
368
371
|
# add entry for space type if it doesn't have one yet
|
369
372
|
if !space_types_local_count.key?(space_type)
|
370
|
-
|
373
|
+
if space_type_hash.has_key?(:children)
|
374
|
+
space_type = space_type_hash[:children][:default][:space_type] # will re-using space type create issue
|
375
|
+
space_types_local_count[space_type] = { floor_area: 0.0 }
|
376
|
+
space_types_local_count[space_type][:children] = space_type_hash[:children]
|
377
|
+
else
|
378
|
+
space_types_local_count[space_type] = { floor_area: 0.0 }
|
379
|
+
end
|
371
380
|
end
|
372
381
|
|
373
382
|
# if there is enough of this space type to fill rest of floor area
|
374
383
|
remaining_in_footprint = target_footprint_area - current_footprint_area
|
375
|
-
|
376
|
-
|
377
|
-
# add to local count for story and remove from running count from space type
|
378
|
-
raw_footprint_area_used = remaining_in_footprint
|
379
|
-
|
380
|
-
else
|
381
|
-
# if not then use up the rest of the floor area and move on to next space type
|
382
|
-
raw_footprint_area_used = space_type_hash[:floor_area]
|
383
|
-
end
|
384
|
+
raw_footprint_area_used = [space_type_hash[:floor_area],remaining_in_footprint].min
|
384
385
|
|
385
386
|
# add to local hash
|
386
387
|
space_types_local_count[space_type][:floor_area] = raw_footprint_area_used / v[:multiplier].to_f
|
@@ -389,13 +390,13 @@ module OsLib_Geometry
|
|
389
390
|
current_footprint_area += raw_footprint_area_used
|
390
391
|
space_type_hash[:floor_area] -= raw_footprint_area_used
|
391
392
|
|
392
|
-
# test if think
|
393
|
+
# test if think sliver left on current floor.
|
393
394
|
# fix by moving smallest space type to next floor and and the same amount more of the sliver space type to this story
|
394
395
|
raw_footprint_area_used < valid_bar_area_min && sliver_override == false ? (test_a = true) : (test_a = false)
|
395
396
|
|
396
397
|
# test if what would be left of the current space type would result in a sliver on the next story.
|
397
398
|
# fix by removing some of this space type so their is enough left for the next story, and replace the removed amount with the largest space type in the model
|
398
|
-
(space_type_hash[:floor_area] < valid_bar_area_min) && (space_type_hash[:floor_area] >
|
399
|
+
(space_type_hash[:floor_area] < valid_bar_area_min) && (space_type_hash[:floor_area] > tol_value) ? (test_b = true) : (test_b = false)
|
399
400
|
|
400
401
|
# identify very small slices and re-arrange spaces to different stories to avoid this
|
401
402
|
if test_a
|
@@ -422,6 +423,10 @@ module OsLib_Geometry
|
|
422
423
|
|
423
424
|
# swap size
|
424
425
|
swap_size = valid_bar_area_min * 5 # currently equal to default perimeter zone depth of 15'
|
426
|
+
# this prevents too much area from being swapped resulting in a negative number for floor area
|
427
|
+
if swap_size > space_types_local_count[space_type][:floor_area] * v[:multiplier].to_f
|
428
|
+
swap_size = space_types_local_count[space_type][:floor_area] * v[:multiplier].to_f
|
429
|
+
end
|
425
430
|
|
426
431
|
# adjust running count for current space type
|
427
432
|
space_type_hash[:floor_area] += swap_size
|
@@ -445,12 +450,18 @@ module OsLib_Geometry
|
|
445
450
|
end
|
446
451
|
|
447
452
|
# sliced bar simple creates a single sliced bar for space types passed in
|
448
|
-
#
|
453
|
+
# look at length and width to adjust slicing direction
|
449
454
|
def self.make_sliced_bar_simple_polygons(runner, space_types, length, width, footprint_origin = OpenStudio::Point3d.new(0, 0, 0), perimeter_zone_depth = OpenStudio.convert(15, 'ft', 'm').get)
|
450
455
|
hash_of_point_vectors = {} # key is name, value is a hash, one item of which is polygon. Another could be space type
|
451
456
|
|
457
|
+
reverse_slice = false
|
458
|
+
if length < width
|
459
|
+
reverse_slice = true
|
460
|
+
#runner.registerInfo("reverse typical slice direction for bar because of aspect ratio less than 1.0.")
|
461
|
+
end
|
462
|
+
|
452
463
|
# determine if core and perimeter zoning can be used
|
453
|
-
if !(length > perimeter_zone_depth * 2.5 && width > perimeter_zone_depth * 2.5)
|
464
|
+
if !([length,width].min > perimeter_zone_depth * 2.5 && [length,width].min > perimeter_zone_depth * 2.5)
|
454
465
|
perimeter_zone_depth = 0 # if any size is to small then just model floor as single zone, issue warning
|
455
466
|
runner.registerWarning('Not modeling core and perimeter zones for some portion of the model.')
|
456
467
|
end
|
@@ -461,6 +472,7 @@ module OsLib_Geometry
|
|
461
472
|
# this represents the entire bar, not individual space type slices
|
462
473
|
nw_point = OpenStudio::Point3d.new(x_delta, y_delta + width, z)
|
463
474
|
sw_point = OpenStudio::Point3d.new(x_delta, y_delta, z)
|
475
|
+
se_point = OpenStudio::Point3d.new(x_delta + length, y_delta, z) # used when length is less than width
|
464
476
|
|
465
477
|
# total building floor area to calculate ratios from space type floor areas
|
466
478
|
total_floor_area = 0.0
|
@@ -470,7 +482,7 @@ module OsLib_Geometry
|
|
470
482
|
|
471
483
|
# sort array by floor area but shift largest object to front
|
472
484
|
space_types = space_types.sort_by { |k, v| v[:floor_area] }
|
473
|
-
space_types.insert(0, space_types.delete_at(space_types.size - 1))
|
485
|
+
space_types.insert(0, space_types.delete_at(space_types.size - 1)) #.to_h
|
474
486
|
|
475
487
|
# min and max bar end values
|
476
488
|
min_bar_end_multiplier = 0.75
|
@@ -484,20 +496,20 @@ module OsLib_Geometry
|
|
484
496
|
start_perimeter_width_deduction = 0.0
|
485
497
|
end_perimeter_width_deduction = 0.0
|
486
498
|
if space_type == space_types.first[0]
|
487
|
-
if length * space_type_hash[:floor_area] / total_floor_area > max_bar_end_multiplier * perimeter_zone_depth
|
499
|
+
if [length,width].max * space_type_hash[:floor_area] / total_floor_area > max_bar_end_multiplier * perimeter_zone_depth
|
488
500
|
start_perimeter_width_deduction = perimeter_zone_depth
|
489
501
|
end
|
490
502
|
# see if last space type is too small for perimeter. If it is then save some of this space type
|
491
|
-
if length * space_types.last[1][:floor_area] / total_floor_area < perimeter_zone_depth * min_bar_end_multiplier
|
503
|
+
if [length,width].max * space_types.last[1][:floor_area] / total_floor_area < perimeter_zone_depth * min_bar_end_multiplier
|
492
504
|
re_apply_largest_space_type_at_end = true
|
493
505
|
end
|
494
506
|
end
|
495
507
|
if space_type == space_types.last[0]
|
496
|
-
if length * space_type_hash[:floor_area] / total_floor_area > max_bar_end_multiplier * perimeter_zone_depth
|
508
|
+
if [length,width].max * space_type_hash[:floor_area] / total_floor_area > max_bar_end_multiplier * perimeter_zone_depth
|
497
509
|
end_perimeter_width_deduction = perimeter_zone_depth
|
498
510
|
end
|
499
511
|
end
|
500
|
-
non_end_adjusted_width = (length * space_type_hash[:floor_area] / total_floor_area) - start_perimeter_width_deduction - end_perimeter_width_deduction
|
512
|
+
non_end_adjusted_width = ([length,width].max * space_type_hash[:floor_area] / total_floor_area) - start_perimeter_width_deduction - end_perimeter_width_deduction
|
501
513
|
|
502
514
|
# adjustment of end space type is too small and is replaced with largest space type
|
503
515
|
if (space_type == space_types.first[0]) && re_apply_largest_space_type_at_end
|
@@ -506,69 +518,223 @@ module OsLib_Geometry
|
|
506
518
|
end
|
507
519
|
if (space_type == space_types.last[0]) && re_apply_largest_space_type_at_end
|
508
520
|
end_perimeter_width_deduction = space_types.first[0]
|
521
|
+
end_b_flag = true
|
522
|
+
else
|
523
|
+
end_b_flag = false
|
509
524
|
end
|
510
525
|
|
511
|
-
#
|
526
|
+
# populate data for core and perimeter of slice
|
512
527
|
section_hash_for_space_type = {}
|
513
528
|
section_hash_for_space_type['end_a'] = start_perimeter_width_deduction
|
514
529
|
section_hash_for_space_type[''] = non_end_adjusted_width
|
515
530
|
section_hash_for_space_type['end_b'] = end_perimeter_width_deduction
|
516
531
|
|
532
|
+
# determine if this space+type is double loaded corridor, and if so what the perimeter zone depth should be based on building width
|
533
|
+
# look at reverse_slice to see if length or width should be used to determine perimeter depth
|
534
|
+
if space_type_hash.has_key?(:children)
|
535
|
+
core_ratio = space_type_hash[:children][:circ][:orig_ratio]
|
536
|
+
perim_ratio = space_type_hash[:children][:default][:orig_ratio]
|
537
|
+
core_ratio_adj = core_ratio / (core_ratio + perim_ratio)
|
538
|
+
perim_ratio_adj = perim_ratio / (core_ratio + perim_ratio)
|
539
|
+
core_space_type = space_type_hash[:children][:circ][:space_type]
|
540
|
+
perim_space_type = space_type_hash[:children][:default][:space_type]
|
541
|
+
if !reverse_slice
|
542
|
+
custom_cor_val = width * core_ratio_adj
|
543
|
+
custom_perim_val = (width - custom_cor_val)/2.0
|
544
|
+
else
|
545
|
+
custom_cor_val = length * core_ratio_adj
|
546
|
+
custom_perim_val = (length - custom_cor_val)/2.0
|
547
|
+
end
|
548
|
+
actual_perim = custom_perim_val
|
549
|
+
double_loaded_corridor = true
|
550
|
+
else
|
551
|
+
actual_perim = perimeter_zone_depth
|
552
|
+
double_loaded_corridor = false
|
553
|
+
end
|
554
|
+
|
555
|
+
# may overwrite
|
556
|
+
first_space_type_hash = space_types.first[1]
|
557
|
+
if end_b_flag && first_space_type_hash.has_key?(:children)
|
558
|
+
end_b_core_ratio = first_space_type_hash[:children][:circ][:orig_ratio]
|
559
|
+
end_b_perim_ratio = first_space_type_hash[:children][:default][:orig_ratio]
|
560
|
+
end_b_core_ratio_adj = end_b_core_ratio / (end_b_core_ratio + end_b_perim_ratio)
|
561
|
+
end_b_perim_ratio_adj = end_b_perim_ratio / (end_b_core_ratio + end_b_perim_ratio)
|
562
|
+
end_b_core_space_type = first_space_type_hash[:children][:circ][:space_type]
|
563
|
+
end_b_perim_space_type = first_space_type_hash[:children][:default][:space_type]
|
564
|
+
if !reverse_slice
|
565
|
+
end_b_custom_cor_val = width * end_b_core_ratio_adj
|
566
|
+
end_b_custom_perim_val = (width - end_b_custom_cor_val)/2.0
|
567
|
+
else
|
568
|
+
end_b_custom_cor_val = length * end_b_core_ratio_adj
|
569
|
+
end_b_custom_perim_val = (length - end_b_custom_cor_val)/2.0
|
570
|
+
end
|
571
|
+
end_b_actual_perim = end_b_custom_perim_val
|
572
|
+
end_b_double_loaded_corridor = true
|
573
|
+
else
|
574
|
+
end_b_actual_perim = perimeter_zone_depth
|
575
|
+
end_b_double_loaded_corridor = false
|
576
|
+
end
|
577
|
+
|
517
578
|
# loop through sections for space type (main and possibly one or two end perimeter sections)
|
518
|
-
section_hash_for_space_type.each do |k,
|
519
|
-
|
520
|
-
|
579
|
+
section_hash_for_space_type.each do |k, slice|
|
580
|
+
|
581
|
+
# need to use different space type for end_b
|
582
|
+
if end_b_flag && k == "end_b" && space_types.first[1].has_key?(:children)
|
583
|
+
slice = space_types.first[0]
|
584
|
+
actual_perim = end_b_actual_perim
|
585
|
+
double_loaded_corridor = end_b_double_loaded_corridor
|
586
|
+
core_ratio = end_b_core_ratio
|
587
|
+
perim_ratio = end_b_perim_ratio
|
588
|
+
core_ratio_adj = end_b_core_ratio_adj
|
589
|
+
perim_ratio_adj = end_b_perim_ratio_adj
|
590
|
+
core_space_type = end_b_core_space_type
|
591
|
+
perim_space_type = end_b_perim_space_type
|
592
|
+
end
|
593
|
+
|
594
|
+
if slice.class.to_s == 'OpenStudio::Model::SpaceType' || slice.class.to_s == 'OpenStudio::Model::Building'
|
595
|
+
space_type = slice
|
521
596
|
max_reduction = [perimeter_zone_depth, max_reduction].min
|
522
|
-
|
597
|
+
slice = max_reduction
|
523
598
|
end
|
524
|
-
if
|
599
|
+
if slice == 0
|
525
600
|
next
|
526
601
|
end
|
527
602
|
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
603
|
+
if !reverse_slice
|
604
|
+
|
605
|
+
ne_point = nw_point + OpenStudio::Vector3d.new(slice, 0, 0)
|
606
|
+
se_point = sw_point + OpenStudio::Vector3d.new(slice, 0, 0)
|
607
|
+
|
608
|
+
if actual_perim > 0 && (actual_perim * 2.0) < width
|
609
|
+
polygon_a = OpenStudio::Point3dVector.new
|
610
|
+
polygon_a << sw_point
|
611
|
+
polygon_a << sw_point + OpenStudio::Vector3d.new(0, actual_perim, 0)
|
612
|
+
polygon_a << se_point + OpenStudio::Vector3d.new(0, actual_perim, 0)
|
613
|
+
polygon_a << se_point
|
614
|
+
if double_loaded_corridor
|
615
|
+
hash_of_point_vectors["#{perim_space_type.name} A #{k}"] = {}
|
616
|
+
hash_of_point_vectors["#{perim_space_type.name} A #{k}"][:space_type] = perim_space_type
|
617
|
+
hash_of_point_vectors["#{perim_space_type.name} A #{k}"][:polygon] = polygon_a
|
618
|
+
else
|
619
|
+
hash_of_point_vectors["#{space_type.name} A #{k}"] = {}
|
620
|
+
hash_of_point_vectors["#{space_type.name} A #{k}"][:space_type] = space_type
|
621
|
+
hash_of_point_vectors["#{space_type.name} A #{k}"][:polygon] = polygon_a
|
622
|
+
end
|
623
|
+
|
624
|
+
polygon_b = OpenStudio::Point3dVector.new
|
625
|
+
polygon_b << sw_point + OpenStudio::Vector3d.new(0, actual_perim, 0)
|
626
|
+
polygon_b << nw_point + OpenStudio::Vector3d.new(0, - actual_perim, 0)
|
627
|
+
polygon_b << ne_point + OpenStudio::Vector3d.new(0, - actual_perim, 0)
|
628
|
+
polygon_b << se_point + OpenStudio::Vector3d.new(0, actual_perim, 0)
|
629
|
+
if double_loaded_corridor
|
630
|
+
hash_of_point_vectors["#{core_space_type.name} B #{k}"] = {}
|
631
|
+
hash_of_point_vectors["#{core_space_type.name} B #{k}"][:space_type] = core_space_type
|
632
|
+
hash_of_point_vectors["#{core_space_type.name} B #{k}"][:polygon] = polygon_b
|
633
|
+
else
|
634
|
+
hash_of_point_vectors["#{space_type.name} B #{k}"] = {}
|
635
|
+
hash_of_point_vectors["#{space_type.name} B #{k}"][:space_type] = space_type
|
636
|
+
hash_of_point_vectors["#{space_type.name} B #{k}"][:polygon] = polygon_b
|
637
|
+
end
|
638
|
+
|
639
|
+
polygon_c = OpenStudio::Point3dVector.new
|
640
|
+
polygon_c << nw_point + OpenStudio::Vector3d.new(0, - actual_perim, 0)
|
641
|
+
polygon_c << nw_point
|
642
|
+
polygon_c << ne_point
|
643
|
+
polygon_c << ne_point + OpenStudio::Vector3d.new(0, - actual_perim, 0)
|
644
|
+
if double_loaded_corridor
|
645
|
+
hash_of_point_vectors["#{perim_space_type.name} C #{k}"] = {}
|
646
|
+
hash_of_point_vectors["#{perim_space_type.name} C #{k}"][:space_type] = perim_space_type
|
647
|
+
hash_of_point_vectors["#{perim_space_type.name} C #{k}"][:polygon] = polygon_c
|
648
|
+
else
|
649
|
+
hash_of_point_vectors["#{space_type.name} C #{k}"] = {}
|
650
|
+
hash_of_point_vectors["#{space_type.name} C #{k}"][:space_type] = space_type
|
651
|
+
hash_of_point_vectors["#{space_type.name} C #{k}"][:polygon] = polygon_c
|
652
|
+
end
|
653
|
+
else
|
654
|
+
polygon_a = OpenStudio::Point3dVector.new
|
655
|
+
polygon_a << sw_point
|
656
|
+
polygon_a << nw_point
|
657
|
+
polygon_a << ne_point
|
658
|
+
polygon_a << se_point
|
659
|
+
hash_of_point_vectors["#{space_type.name} #{k}"] = {}
|
660
|
+
hash_of_point_vectors["#{space_type.name} #{k}"][:space_type] = space_type
|
661
|
+
hash_of_point_vectors["#{space_type.name} #{k}"][:polygon] = polygon_a
|
662
|
+
end
|
663
|
+
|
664
|
+
# update west points
|
665
|
+
nw_point = ne_point
|
666
|
+
sw_point = se_point
|
667
|
+
|
558
668
|
else
|
559
|
-
polygon_a = OpenStudio::Point3dVector.new
|
560
|
-
polygon_a << sw_point
|
561
|
-
polygon_a << nw_point
|
562
|
-
polygon_a << ne_point
|
563
|
-
polygon_a << se_point
|
564
|
-
hash_of_point_vectors["#{space_type.name} #{k}"] = {}
|
565
|
-
hash_of_point_vectors["#{space_type.name} #{k}"][:space_type] = space_type
|
566
|
-
hash_of_point_vectors["#{space_type.name} #{k}"][:polygon] = polygon_a
|
567
|
-
end
|
568
669
|
|
569
|
-
|
570
|
-
|
571
|
-
|
670
|
+
# create_bar at 90 degrees if aspect ration is less than 1.0
|
671
|
+
# typical order (sw,nw,ne,se)
|
672
|
+
# order used here (se,sw,nw,ne)
|
673
|
+
|
674
|
+
nw_point = sw_point + OpenStudio::Vector3d.new(0, slice, 0)
|
675
|
+
ne_point = se_point + OpenStudio::Vector3d.new(0, slice, 0)
|
676
|
+
|
677
|
+
if actual_perim > 0 && (actual_perim * 2.0) < length
|
678
|
+
polygon_a = OpenStudio::Point3dVector.new
|
679
|
+
polygon_a << se_point
|
680
|
+
polygon_a << se_point + OpenStudio::Vector3d.new(- actual_perim, 0, 0)
|
681
|
+
polygon_a << ne_point + OpenStudio::Vector3d.new(- actual_perim, 0, 0)
|
682
|
+
polygon_a << ne_point
|
683
|
+
if double_loaded_corridor
|
684
|
+
hash_of_point_vectors["#{perim_space_type.name} A #{k}"] = {}
|
685
|
+
hash_of_point_vectors["#{perim_space_type.name} A #{k}"][:space_type] = perim_space_type
|
686
|
+
hash_of_point_vectors["#{perim_space_type.name} A #{k}"][:polygon] = polygon_a
|
687
|
+
else
|
688
|
+
hash_of_point_vectors["#{space_type.name} A #{k}"] = {}
|
689
|
+
hash_of_point_vectors["#{space_type.name} A #{k}"][:space_type] = space_type
|
690
|
+
hash_of_point_vectors["#{space_type.name} A #{k}"][:polygon] = polygon_a
|
691
|
+
end
|
692
|
+
|
693
|
+
polygon_b = OpenStudio::Point3dVector.new
|
694
|
+
polygon_b << se_point + OpenStudio::Vector3d.new(- actual_perim, 0, 0)
|
695
|
+
polygon_b << sw_point + OpenStudio::Vector3d.new(actual_perim, 0, 0)
|
696
|
+
polygon_b << nw_point + OpenStudio::Vector3d.new(actual_perim, 0, 0)
|
697
|
+
polygon_b << ne_point + OpenStudio::Vector3d.new(- actual_perim, 0, 0)
|
698
|
+
if double_loaded_corridor
|
699
|
+
hash_of_point_vectors["#{core_space_type.name} B #{k}"] = {}
|
700
|
+
hash_of_point_vectors["#{core_space_type.name} B #{k}"][:space_type] = core_space_type
|
701
|
+
hash_of_point_vectors["#{core_space_type.name} B #{k}"][:polygon] = polygon_b
|
702
|
+
else
|
703
|
+
hash_of_point_vectors["#{space_type.name} B #{k}"] = {}
|
704
|
+
hash_of_point_vectors["#{space_type.name} B #{k}"][:space_type] = space_type
|
705
|
+
hash_of_point_vectors["#{space_type.name} B #{k}"][:polygon] = polygon_b
|
706
|
+
end
|
707
|
+
|
708
|
+
polygon_c = OpenStudio::Point3dVector.new
|
709
|
+
polygon_c << sw_point + OpenStudio::Vector3d.new(actual_perim, 0, 0)
|
710
|
+
polygon_c << sw_point
|
711
|
+
polygon_c << nw_point
|
712
|
+
polygon_c << nw_point + OpenStudio::Vector3d.new(actual_perim, 0, 0)
|
713
|
+
if double_loaded_corridor
|
714
|
+
hash_of_point_vectors["#{perim_space_type.name} C #{k}"] = {}
|
715
|
+
hash_of_point_vectors["#{perim_space_type.name} C #{k}"][:space_type] = perim_space_type
|
716
|
+
hash_of_point_vectors["#{perim_space_type.name} C #{k}"][:polygon] = polygon_c
|
717
|
+
else
|
718
|
+
hash_of_point_vectors["#{space_type.name} C #{k}"] = {}
|
719
|
+
hash_of_point_vectors["#{space_type.name} C #{k}"][:space_type] = space_type
|
720
|
+
hash_of_point_vectors["#{space_type.name} C #{k}"][:polygon] = polygon_c
|
721
|
+
end
|
722
|
+
else
|
723
|
+
polygon_a = OpenStudio::Point3dVector.new
|
724
|
+
polygon_a << se_point
|
725
|
+
polygon_a << sw_point
|
726
|
+
polygon_a << nw_point
|
727
|
+
polygon_a << ne_point
|
728
|
+
hash_of_point_vectors["#{space_type.name} #{k}"] = {}
|
729
|
+
hash_of_point_vectors["#{space_type.name} #{k}"][:space_type] = space_type
|
730
|
+
hash_of_point_vectors["#{space_type.name} #{k}"][:polygon] = polygon_a
|
731
|
+
end
|
732
|
+
|
733
|
+
# update west points
|
734
|
+
sw_point = nw_point
|
735
|
+
se_point = ne_point
|
736
|
+
|
737
|
+
end
|
572
738
|
end
|
573
739
|
end
|
574
740
|
|
@@ -592,13 +758,24 @@ module OsLib_Geometry
|
|
592
758
|
end
|
593
759
|
end
|
594
760
|
|
761
|
+
# hash of new spaces (only change boundary conditions for these)
|
762
|
+
new_spaces = []
|
763
|
+
|
595
764
|
# loop through story_hash and polygons to generate all of the spaces
|
596
765
|
story_hash.each_with_index do |(story_name, story_data), index|
|
597
|
-
# make new story
|
598
|
-
story =
|
599
|
-
|
600
|
-
|
601
|
-
|
766
|
+
# make new story unless story at requested height already exists.
|
767
|
+
story = nil
|
768
|
+
model.getBuildingStorys.each do |ext_story|
|
769
|
+
if (ext_story.nominalZCoordinate.to_f - story_data[:space_origin_z].to_f).abs < 0.01
|
770
|
+
story = ext_story
|
771
|
+
end
|
772
|
+
end
|
773
|
+
if story.nil?
|
774
|
+
story = OpenStudio::Model::BuildingStory.new(model)
|
775
|
+
story.setNominalFloortoFloorHeight(story_data[:space_height]) # not used for anything
|
776
|
+
story.setNominalZCoordinate (story_data[:space_origin_z]) # not used for anything
|
777
|
+
story.setName("Story #{story_name}")
|
778
|
+
end
|
602
779
|
|
603
780
|
# multiplier values for adjacent stories to be altered below as needed
|
604
781
|
multiplier_story_above = 1
|
@@ -647,6 +824,7 @@ module OsLib_Geometry
|
|
647
824
|
|
648
825
|
# make space
|
649
826
|
space = OsLib_Geometry.makeSpaceFromPolygon(model, space_data[:polygon].first, space_data[:polygon], options)
|
827
|
+
new_spaces << space
|
650
828
|
|
651
829
|
# set z origin to proper position
|
652
830
|
space.setZOrigin(story_data[:space_origin_z])
|
@@ -676,7 +854,7 @@ module OsLib_Geometry
|
|
676
854
|
# any changes to wall boundary conditions will be handled by same code that calls this method.
|
677
855
|
# this method doesn't need to know about basements and party walls.
|
678
856
|
|
679
|
-
return
|
857
|
+
return new_spaces
|
680
858
|
end
|
681
859
|
|
682
860
|
# add def to create a space from input, optionally take a name, space type, story and thermal zone.
|
@@ -714,7 +892,7 @@ module OsLib_Geometry
|
|
714
892
|
space.setName(options['name'])
|
715
893
|
end
|
716
894
|
|
717
|
-
if !options['spaceType'].nil?
|
895
|
+
if !options['spaceType'].nil? && options['spaceType'].class.to_s == 'OpenStudio::Model::SpaceType'
|
718
896
|
space.setSpaceType(options['spaceType'])
|
719
897
|
end
|
720
898
|
|