@jetta/axle-load-calculator 0.1.3
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.
- package/.cursor/ai_changelog/INDEX.md +13 -0
- package/.cursor/ai_changelog/_TEMPLATE.md +55 -0
- package/.cursor/rules/code-standards.mdc +103 -0
- package/.cursor/rules/knowledge-base.mdc +14 -0
- package/.cursor/rules/planning-standards.mdc +55 -0
- package/.cursor/skills/document-feature-knowledge/SKILL.md +51 -0
- package/README.md +49 -0
- package/bitbucket-pipelines.yml +81 -0
- package/build/core/contracts/chassi_reference.d.ts +7 -0
- package/build/core/contracts/chassi_reference.d.ts.map +1 -0
- package/build/core/contracts/chassi_reference.js +5 -0
- package/build/core/contracts/ms_faixas_contract.d.ts +13 -0
- package/build/core/contracts/ms_faixas_contract.d.ts.map +1 -0
- package/build/core/contracts/ms_faixas_contract.js +89 -0
- package/build/core/contracts/rotation_enum.d.ts +11 -0
- package/build/core/contracts/rotation_enum.d.ts.map +1 -0
- package/build/core/contracts/rotation_enum.js +9 -0
- package/build/core/contracts/suspension_type.d.ts +5 -0
- package/build/core/contracts/suspension_type.d.ts.map +1 -0
- package/build/core/contracts/suspension_type.js +4 -0
- package/build/core/contracts/transport_record.d.ts +5 -0
- package/build/core/contracts/transport_record.d.ts.map +1 -0
- package/build/core/contracts/transport_record.js +1 -0
- package/build/core/contracts/vehicle_type.d.ts +12 -0
- package/build/core/contracts/vehicle_type.d.ts.map +1 -0
- package/build/core/contracts/vehicle_type.js +10 -0
- package/build/core/contracts/vehicle_version.d.ts +8 -0
- package/build/core/contracts/vehicle_version.d.ts.map +1 -0
- package/build/core/contracts/vehicle_version.js +7 -0
- package/build/core/contracts/wire_flags.d.ts +27 -0
- package/build/core/contracts/wire_flags.d.ts.map +1 -0
- package/build/core/contracts/wire_flags.js +26 -0
- package/build/core/math/float_tools.d.ts +7 -0
- package/build/core/math/float_tools.d.ts.map +1 -0
- package/build/core/math/float_tools.js +14 -0
- package/build/core/math/gaussian_elimination.d.ts +8 -0
- package/build/core/math/gaussian_elimination.d.ts.map +1 -0
- package/build/core/math/gaussian_elimination.js +85 -0
- package/build/core/orchestration/axle_weight_physics.d.ts +7 -0
- package/build/core/orchestration/axle_weight_physics.d.ts.map +1 -0
- package/build/core/orchestration/axle_weight_physics.js +27 -0
- package/build/core/orchestration/collision_checker.d.ts +6 -0
- package/build/core/orchestration/collision_checker.d.ts.map +1 -0
- package/build/core/orchestration/collision_checker.js +67 -0
- package/build/core/orchestration/connector_payload_builder.d.ts +11 -0
- package/build/core/orchestration/connector_payload_builder.d.ts.map +1 -0
- package/build/core/orchestration/connector_payload_builder.js +67 -0
- package/build/core/orchestration/java_mass_center.d.ts +9 -0
- package/build/core/orchestration/java_mass_center.d.ts.map +1 -0
- package/build/core/orchestration/java_mass_center.js +79 -0
- package/build/core/orchestration/output_builder.d.ts +11 -0
- package/build/core/orchestration/output_builder.d.ts.map +1 -0
- package/build/core/orchestration/output_builder.js +15 -0
- package/build/core/orchestration/request_schema.d.ts +65 -0
- package/build/core/orchestration/request_schema.d.ts.map +1 -0
- package/build/core/orchestration/request_schema.js +20 -0
- package/build/core/orchestration/weight_by_axis_task.d.ts +7 -0
- package/build/core/orchestration/weight_by_axis_task.d.ts.map +1 -0
- package/build/core/orchestration/weight_by_axis_task.js +105 -0
- package/build/core/physics/items/allocated_item.d.ts +22 -0
- package/build/core/physics/items/allocated_item.d.ts.map +1 -0
- package/build/core/physics/items/allocated_item.js +29 -0
- package/build/core/physics/items/allocated_item_manager.d.ts +31 -0
- package/build/core/physics/items/allocated_item_manager.d.ts.map +1 -0
- package/build/core/physics/items/allocated_item_manager.js +38 -0
- package/build/core/physics/items/center_of_mass.d.ts +14 -0
- package/build/core/physics/items/center_of_mass.d.ts.map +1 -0
- package/build/core/physics/items/center_of_mass.js +24 -0
- package/build/core/physics/items/compute_grouper_center_of_mass.d.ts +19 -0
- package/build/core/physics/items/compute_grouper_center_of_mass.d.ts.map +1 -0
- package/build/core/physics/items/compute_grouper_center_of_mass.js +28 -0
- package/build/core/physics/items/item_templates.d.ts +32 -0
- package/build/core/physics/items/item_templates.d.ts.map +1 -0
- package/build/core/physics/items/item_templates.js +53 -0
- package/build/core/physics/items/multi_container_allocated_items.d.ts +37 -0
- package/build/core/physics/items/multi_container_allocated_items.d.ts.map +1 -0
- package/build/core/physics/items/multi_container_allocated_items.js +91 -0
- package/build/core/physics/items/rotation_transforms.d.ts +8 -0
- package/build/core/physics/items/rotation_transforms.d.ts.map +1 -0
- package/build/core/physics/items/rotation_transforms.js +21 -0
- package/build/core/physics/models/axle_weight_model.d.ts +32 -0
- package/build/core/physics/models/axle_weight_model.d.ts.map +1 -0
- package/build/core/physics/models/axle_weight_model.js +72 -0
- package/build/core/physics/models/bi_truck_model.d.ts +21 -0
- package/build/core/physics/models/bi_truck_model.d.ts.map +1 -0
- package/build/core/physics/models/bi_truck_model.js +60 -0
- package/build/core/physics/models/bi_truck_tractor_semi_trailer_model.d.ts +21 -0
- package/build/core/physics/models/bi_truck_tractor_semi_trailer_model.d.ts.map +1 -0
- package/build/core/physics/models/bi_truck_tractor_semi_trailer_model.js +69 -0
- package/build/core/physics/models/bitrem_model.d.ts +33 -0
- package/build/core/physics/models/bitrem_model.d.ts.map +1 -0
- package/build/core/physics/models/bitrem_model.js +123 -0
- package/build/core/physics/models/chassi_forces.d.ts +30 -0
- package/build/core/physics/models/chassi_forces.d.ts.map +1 -0
- package/build/core/physics/models/chassi_forces.js +39 -0
- package/build/core/physics/models/deflection/beam_deflection.d.ts +28 -0
- package/build/core/physics/models/deflection/beam_deflection.d.ts.map +1 -0
- package/build/core/physics/models/deflection/beam_deflection.js +78 -0
- package/build/core/physics/models/deflection/bitrem_deflection.d.ts +22 -0
- package/build/core/physics/models/deflection/bitrem_deflection.d.ts.map +1 -0
- package/build/core/physics/models/deflection/bitrem_deflection.js +54 -0
- package/build/core/physics/models/deflection/create_deflection_delegate.d.ts +12 -0
- package/build/core/physics/models/deflection/create_deflection_delegate.d.ts.map +1 -0
- package/build/core/physics/models/deflection/create_deflection_delegate.js +32 -0
- package/build/core/physics/models/deflection/deflection_model.d.ts +19 -0
- package/build/core/physics/models/deflection/deflection_model.d.ts.map +1 -0
- package/build/core/physics/models/deflection/deflection_model.js +23 -0
- package/build/core/physics/models/deflection/deflection_support_manager.d.ts +21 -0
- package/build/core/physics/models/deflection/deflection_support_manager.d.ts.map +1 -0
- package/build/core/physics/models/deflection/deflection_support_manager.js +40 -0
- package/build/core/physics/models/deflection/deflection_tools.d.ts +6 -0
- package/build/core/physics/models/deflection/deflection_tools.d.ts.map +1 -0
- package/build/core/physics/models/deflection/deflection_tools.js +10 -0
- package/build/core/physics/models/deflection/integration_constant_calculator.d.ts +22 -0
- package/build/core/physics/models/deflection/integration_constant_calculator.d.ts.map +1 -0
- package/build/core/physics/models/deflection/integration_constant_calculator.js +48 -0
- package/build/core/physics/models/deflection/rodotrem_deflection.d.ts +22 -0
- package/build/core/physics/models/deflection/rodotrem_deflection.d.ts.map +1 -0
- package/build/core/physics/models/deflection/rodotrem_deflection.js +47 -0
- package/build/core/physics/models/deflection/semi_reboque_deflection.d.ts +21 -0
- package/build/core/physics/models/deflection/semi_reboque_deflection.d.ts.map +1 -0
- package/build/core/physics/models/deflection/semi_reboque_deflection.js +31 -0
- package/build/core/physics/models/deflection/simple_truck_deflection.d.ts +20 -0
- package/build/core/physics/models/deflection/simple_truck_deflection.d.ts.map +1 -0
- package/build/core/physics/models/deflection/simple_truck_deflection.js +28 -0
- package/build/core/physics/models/deflection/vanderleia_deflection.d.ts +21 -0
- package/build/core/physics/models/deflection/vanderleia_deflection.d.ts.map +1 -0
- package/build/core/physics/models/deflection/vanderleia_deflection.js +41 -0
- package/build/core/physics/models/old_tare_model.d.ts +17 -0
- package/build/core/physics/models/old_tare_model.d.ts.map +1 -0
- package/build/core/physics/models/old_tare_model.js +40 -0
- package/build/core/physics/models/old_tare_scale.d.ts +7 -0
- package/build/core/physics/models/old_tare_scale.d.ts.map +1 -0
- package/build/core/physics/models/old_tare_scale.js +8 -0
- package/build/core/physics/models/old_tare_semireboque.d.ts +7 -0
- package/build/core/physics/models/old_tare_semireboque.d.ts.map +1 -0
- package/build/core/physics/models/old_tare_semireboque.js +37 -0
- package/build/core/physics/models/old_tare_truck.d.ts +7 -0
- package/build/core/physics/models/old_tare_truck.d.ts.map +1 -0
- package/build/core/physics/models/old_tare_truck.js +12 -0
- package/build/core/physics/models/old_tare_vanderleia.d.ts +7 -0
- package/build/core/physics/models/old_tare_vanderleia.d.ts.map +1 -0
- package/build/core/physics/models/old_tare_vanderleia.js +31 -0
- package/build/core/physics/models/percentage_on_axles_calculator.d.ts +19 -0
- package/build/core/physics/models/percentage_on_axles_calculator.d.ts.map +1 -0
- package/build/core/physics/models/percentage_on_axles_calculator.js +39 -0
- package/build/core/physics/models/quad_semi_trailer_model.d.ts +21 -0
- package/build/core/physics/models/quad_semi_trailer_model.d.ts.map +1 -0
- package/build/core/physics/models/quad_semi_trailer_model.js +70 -0
- package/build/core/physics/models/rodotrem_model.d.ts +33 -0
- package/build/core/physics/models/rodotrem_model.d.ts.map +1 -0
- package/build/core/physics/models/rodotrem_model.js +101 -0
- package/build/core/physics/models/semi_reboque_base.d.ts +34 -0
- package/build/core/physics/models/semi_reboque_base.d.ts.map +1 -0
- package/build/core/physics/models/semi_reboque_base.js +85 -0
- package/build/core/physics/models/semi_reboque_model.d.ts +41 -0
- package/build/core/physics/models/semi_reboque_model.d.ts.map +1 -0
- package/build/core/physics/models/semi_reboque_model.js +84 -0
- package/build/core/physics/models/simple_truck_base.d.ts +29 -0
- package/build/core/physics/models/simple_truck_base.d.ts.map +1 -0
- package/build/core/physics/models/simple_truck_base.js +57 -0
- package/build/core/physics/models/simple_truck_model.d.ts +41 -0
- package/build/core/physics/models/simple_truck_model.d.ts.map +1 -0
- package/build/core/physics/models/simple_truck_model.js +76 -0
- package/build/core/physics/models/single_container_tare.d.ts +18 -0
- package/build/core/physics/models/single_container_tare.d.ts.map +1 -0
- package/build/core/physics/models/single_container_tare.js +45 -0
- package/build/core/physics/models/tare_model.d.ts +12 -0
- package/build/core/physics/models/tare_model.d.ts.map +1 -0
- package/build/core/physics/models/tare_model.js +36 -0
- package/build/core/physics/models/vanderleia_model.d.ts +33 -0
- package/build/core/physics/models/vanderleia_model.d.ts.map +1 -0
- package/build/core/physics/models/vanderleia_model.js +100 -0
- package/build/core/physics/services/axle_weight_output_builder.d.ts +27 -0
- package/build/core/physics/services/axle_weight_output_builder.d.ts.map +1 -0
- package/build/core/physics/services/axle_weight_output_builder.js +42 -0
- package/build/core/physics/services/axle_weight_service.d.ts +20 -0
- package/build/core/physics/services/axle_weight_service.d.ts.map +1 -0
- package/build/core/physics/services/axle_weight_service.js +91 -0
- package/build/core/physics/services/cm_axle_weight_service.d.ts +12 -0
- package/build/core/physics/services/cm_axle_weight_service.d.ts.map +1 -0
- package/build/core/physics/services/cm_axle_weight_service.js +33 -0
- package/build/core/physics/services/container_corner_forces.d.ts +33 -0
- package/build/core/physics/services/container_corner_forces.d.ts.map +1 -0
- package/build/core/physics/services/container_corner_forces.js +84 -0
- package/build/core/physics/transports/axle_manager.d.ts +22 -0
- package/build/core/physics/transports/axle_manager.d.ts.map +1 -0
- package/build/core/physics/transports/axle_manager.js +34 -0
- package/build/core/physics/transports/axle_record.d.ts +21 -0
- package/build/core/physics/transports/axle_record.d.ts.map +1 -0
- package/build/core/physics/transports/axle_record.js +57 -0
- package/build/core/physics/transports/chassi.d.ts +52 -0
- package/build/core/physics/transports/chassi.d.ts.map +1 -0
- package/build/core/physics/transports/chassi.js +105 -0
- package/build/core/physics/transports/container_record.d.ts +25 -0
- package/build/core/physics/transports/container_record.d.ts.map +1 -0
- package/build/core/physics/transports/container_record.js +49 -0
- package/build/core/physics/transports/containerweight/container_max_weight_calculator.d.ts +27 -0
- package/build/core/physics/transports/containerweight/container_max_weight_calculator.d.ts.map +1 -0
- package/build/core/physics/transports/containerweight/container_max_weight_calculator.js +40 -0
- package/build/core/physics/transports/containerweight/container_tare_calculator.d.ts +28 -0
- package/build/core/physics/transports/containerweight/container_tare_calculator.d.ts.map +1 -0
- package/build/core/physics/transports/containerweight/container_tare_calculator.js +55 -0
- package/build/core/physics/transports/containerweight/container_weight_model.d.ts +15 -0
- package/build/core/physics/transports/containerweight/container_weight_model.d.ts.map +1 -0
- package/build/core/physics/transports/containerweight/container_weight_model.js +31 -0
- package/build/core/physics/transports/containerweight/merged_containers_weight_calculator.d.ts +17 -0
- package/build/core/physics/transports/containerweight/merged_containers_weight_calculator.d.ts.map +1 -0
- package/build/core/physics/transports/containerweight/merged_containers_weight_calculator.js +31 -0
- package/build/core/physics/transports/containerweight/single_container_weight_calculator.d.ts +20 -0
- package/build/core/physics/transports/containerweight/single_container_weight_calculator.d.ts.map +1 -0
- package/build/core/physics/transports/containerweight/single_container_weight_calculator.js +48 -0
- package/build/core/physics/transports/grouped_containers.d.ts +34 -0
- package/build/core/physics/transports/grouped_containers.d.ts.map +1 -0
- package/build/core/physics/transports/grouped_containers.js +68 -0
- package/build/core/physics/transports/merged_containers.d.ts +26 -0
- package/build/core/physics/transports/merged_containers.d.ts.map +1 -0
- package/build/core/physics/transports/merged_containers.js +45 -0
- package/build/core/physics/transports/tare/bitrem_axle_splitter.d.ts +26 -0
- package/build/core/physics/transports/tare/bitrem_axle_splitter.d.ts.map +1 -0
- package/build/core/physics/transports/tare/bitrem_axle_splitter.js +84 -0
- package/build/core/physics/transports/tare/bitrem_axle_weight_split.d.ts +22 -0
- package/build/core/physics/transports/tare/bitrem_axle_weight_split.d.ts.map +1 -0
- package/build/core/physics/transports/tare/bitrem_axle_weight_split.js +32 -0
- package/build/core/physics/transports/transport.d.ts +33 -0
- package/build/core/physics/transports/transport.d.ts.map +1 -0
- package/build/core/physics/transports/transport.js +110 -0
- package/build/index.d.ts +8 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +10 -0
- package/eslint.config.js +51 -0
- package/package.json +38 -0
- package/src/core/contracts/chassi_reference.ts +7 -0
- package/src/core/contracts/ms_faixas_contract.ts +114 -0
- package/src/core/contracts/rotation_enum.ts +11 -0
- package/src/core/contracts/suspension_type.ts +4 -0
- package/src/core/contracts/transport_record.ts +4 -0
- package/src/core/contracts/vehicle_type.ts +12 -0
- package/src/core/contracts/vehicle_version.ts +7 -0
- package/src/core/contracts/wire_flags.ts +26 -0
- package/src/core/math/float_tools.ts +17 -0
- package/src/core/math/gaussian_elimination.ts +104 -0
- package/src/core/orchestration/axle_weight_physics.ts +37 -0
- package/src/core/orchestration/collision_checker.ts +86 -0
- package/src/core/orchestration/connector_payload_builder.ts +81 -0
- package/src/core/orchestration/java_mass_center.ts +98 -0
- package/src/core/orchestration/output_builder.ts +18 -0
- package/src/core/orchestration/request_schema.ts +26 -0
- package/src/core/orchestration/weight_by_axis_task.ts +140 -0
- package/src/core/physics/items/allocated_item.ts +41 -0
- package/src/core/physics/items/allocated_item_manager.ts +50 -0
- package/src/core/physics/items/center_of_mass.ts +31 -0
- package/src/core/physics/items/compute_grouper_center_of_mass.ts +44 -0
- package/src/core/physics/items/item_templates.ts +65 -0
- package/src/core/physics/items/multi_container_allocated_items.ts +120 -0
- package/src/core/physics/items/rotation_transforms.ts +29 -0
- package/src/core/physics/models/axle_weight_model.ts +109 -0
- package/src/core/physics/models/bi_truck_model.ts +74 -0
- package/src/core/physics/models/bi_truck_tractor_semi_trailer_model.ts +86 -0
- package/src/core/physics/models/bitrem_model.ts +148 -0
- package/src/core/physics/models/chassi_forces.ts +50 -0
- package/src/core/physics/models/deflection/beam_deflection.ts +105 -0
- package/src/core/physics/models/deflection/bitrem_deflection.ts +68 -0
- package/src/core/physics/models/deflection/create_deflection_delegate.ts +46 -0
- package/src/core/physics/models/deflection/deflection_model.ts +33 -0
- package/src/core/physics/models/deflection/deflection_support_manager.ts +56 -0
- package/src/core/physics/models/deflection/deflection_tools.ts +11 -0
- package/src/core/physics/models/deflection/integration_constant_calculator.ts +62 -0
- package/src/core/physics/models/deflection/rodotrem_deflection.ts +57 -0
- package/src/core/physics/models/deflection/semi_reboque_deflection.ts +40 -0
- package/src/core/physics/models/deflection/simple_truck_deflection.ts +35 -0
- package/src/core/physics/models/deflection/vanderleia_deflection.ts +48 -0
- package/src/core/physics/models/old_tare_model.ts +51 -0
- package/src/core/physics/models/old_tare_scale.ts +9 -0
- package/src/core/physics/models/old_tare_semireboque.ts +51 -0
- package/src/core/physics/models/old_tare_truck.ts +15 -0
- package/src/core/physics/models/old_tare_vanderleia.ts +44 -0
- package/src/core/physics/models/percentage_on_axles_calculator.ts +49 -0
- package/src/core/physics/models/quad_semi_trailer_model.ts +87 -0
- package/src/core/physics/models/rodotrem_model.ts +131 -0
- package/src/core/physics/models/semi_reboque_base.ts +103 -0
- package/src/core/physics/models/semi_reboque_model.ts +127 -0
- package/src/core/physics/models/simple_truck_base.ts +70 -0
- package/src/core/physics/models/simple_truck_model.ts +115 -0
- package/src/core/physics/models/single_container_tare.ts +56 -0
- package/src/core/physics/models/tare_model.ts +46 -0
- package/src/core/physics/models/vanderleia_model.ts +125 -0
- package/src/core/physics/services/axle_weight_output_builder.ts +63 -0
- package/src/core/physics/services/axle_weight_service.ts +116 -0
- package/src/core/physics/services/cm_axle_weight_service.ts +45 -0
- package/src/core/physics/services/container_corner_forces.ts +95 -0
- package/src/core/physics/transports/axle_manager.ts +45 -0
- package/src/core/physics/transports/axle_record.ts +68 -0
- package/src/core/physics/transports/chassi.ts +130 -0
- package/src/core/physics/transports/container_record.ts +58 -0
- package/src/core/physics/transports/containerweight/container_max_weight_calculator.ts +59 -0
- package/src/core/physics/transports/containerweight/container_tare_calculator.ts +76 -0
- package/src/core/physics/transports/containerweight/container_weight_model.ts +38 -0
- package/src/core/physics/transports/containerweight/merged_containers_weight_calculator.ts +39 -0
- package/src/core/physics/transports/containerweight/single_container_weight_calculator.ts +65 -0
- package/src/core/physics/transports/grouped_containers.ts +91 -0
- package/src/core/physics/transports/merged_containers.ts +62 -0
- package/src/core/physics/transports/tare/bitrem_axle_splitter.ts +107 -0
- package/src/core/physics/transports/tare/bitrem_axle_weight_split.ts +55 -0
- package/src/core/physics/transports/transport.ts +137 -0
- package/src/index.ts +12 -0
- package/src/service/.gitkeep +0 -0
- package/test/data/src/core/orchestration/weight_by_axis/case_1_basic_truck_input.json +1759 -0
- package/test/data/src/core/orchestration/weight_by_axis/case_2_vanderleia_input.json +1286 -0
- package/test/data/src/core/orchestration/weight_by_axis/case_3_interlink_input.json +2226 -0
- package/test/data/src/core/orchestration/weight_by_axis/case_4_quad_semi_trailer.json +639 -0
- package/test/data/src/core/orchestration/weight_by_axis/case_5_custom_center_of_gravity.json +557 -0
- package/test/data/src/core/physics/axle_weight_calculations/case_2_bitruck.json +664 -0
- package/test/data/src/core/physics/axle_weight_calculations/case_4_quad_semi_trailer.json +674 -0
- package/test/data/src/core/physics/axle_weight_calculations/case_5_bi_truck_semi_trailer.json +674 -0
- package/test/data/src/core/physics/axle_weight_service/case_1_input_truck.json +1025 -0
- package/test/data/src/core/physics/axle_weight_service/case_1_output_truck.json +38 -0
- package/test/data/src/core/physics/axle_weight_service/case_2_vanderleia_input.json +1286 -0
- package/test/data/src/core/physics/axle_weight_service/case_2_vanderleia_output.json +65 -0
- package/test/data/src/core/physics/axle_weight_service/case_3_input_semireboque.json +24625 -0
- package/test/data/src/core/physics/axle_weight_service/case_3_output_semireboque.json +57 -0
- package/test/data/src/core/physics/axle_weight_service/case_4_input_bitrem.json +2226 -0
- package/test/data/src/core/physics/axle_weight_service/case_4_output_bitrem.json +96 -0
- package/test/data/src/core/physics/beam_deflection/case_10_rodotrem_offset.json +474 -0
- package/test/data/src/core/physics/beam_deflection/case_11_bitruck.json +664 -0
- package/test/data/src/core/physics/beam_deflection/case_12_quad_semi_trailer.json +792 -0
- package/test/data/src/core/physics/beam_deflection/case_13_bi_truck_semi_trailer.json +792 -0
- package/test/data/src/core/physics/beam_deflection/case_1_documentation.ipynb +316 -0
- package/test/data/src/core/physics/beam_deflection/case_1_semireboque.json +402 -0
- package/test/data/src/core/physics/beam_deflection/case_2_bitrem.json +434 -0
- package/test/data/src/core/physics/beam_deflection/case_3_rodotrem.json +474 -0
- package/test/data/src/core/physics/beam_deflection/case_4_vanderleia_pneumatica.json +425 -0
- package/test/data/src/core/physics/beam_deflection/case_5_vanderleia_mecanica.json +366 -0
- package/test/data/src/core/physics/beam_deflection/case_6_truck.json +279 -0
- package/test/data/src/core/physics/beam_deflection/case_7_semireboque_structural_offset.json +318 -0
- package/test/data/src/core/physics/beam_deflection/case_8_vanderleia_offset.json +425 -0
- package/test/data/src/core/physics/beam_deflection/case_9_bitrem_offset.json +434 -0
- package/test/data/src/core/physics/bitrem_axle_splitter/case_1_simple_bitrem.json +145 -0
- package/test/data/src/core/physics/bitrem_axle_splitter/case_2_lowered_bitrem.json +238 -0
- package/test/data/src/core/physics/bitrem_axle_splitter/case_3_lowered_positive_proportion.json +238 -0
- package/test/data/src/core/physics/c_m_axle_weight_service/case_1_interlink_trailer.json +94 -0
- package/test/data/src/core/physics/calculations/case_1_simple_truck.json +83 -0
- package/test/data/src/core/physics/calculations/case_2_lowered_bitrem.json +1051 -0
- package/test/data/src/core/physics/calculations/case_3_container_mercedes.json +50 -0
- package/test/data/src/core/physics/container_corner_forces/case_1.json +674 -0
- package/test/data/src/core/physics/container_weight/case_1_basictruck.json +223 -0
- package/test/data/src/core/physics/container_weight/case_2_roadtrain.json +277 -0
- package/test/data/src/core/physics/container_weight/case_3_semireboque_rebaixado.json +197 -0
- package/test/data/src/core/physics/container_weight/case_4_semireboque_neck_limit.json +197 -0
- package/test/data/src/core/physics/container_weight/case_5_vanderleia_rebaixada.json +211 -0
- package/test/data/src/core/physics/container_weight/case_6_lowered_interlink.json +230 -0
- package/test/data/src/core/physics/python_goldens.json +9 -0
- package/test/data/src/core/physics/tare/case_1_simple_vanderleia.json +185 -0
- package/test/data/src/core/physics/tare/case_2_lowered_vanderleia.json +646 -0
- package/test/data/src/core/physics/tare/case_3_lowered_interlink.json +230 -0
- package/test/data/src/core/physics/tare/case_4_negative_tare_VUC.json +483 -0
- package/test/data/src/core/physics/tare/case_5_truck_bitruck.json +664 -0
- package/test/data/src/core/physics/tare/case_6_quad_semi_trailer.json +203 -0
- package/test/data/src/core/physics/tare/case_7_bi_truck_semi_trailer.json +203 -0
- package/test/data/src/core/physics/tare/case_8_triaxle_semi_trailer.json +203 -0
- package/test/data/src/core/physics/time_performance/case_1_center_of_mass.json +2916 -0
- package/test/data/src/core/physics/trucks/bitrem.json +150 -0
- package/test/data/src/core/physics/trucks/lowered_bitrem.json +1216 -0
- package/test/data/src/core/physics/trucks/lowered_bitrem_empty_first_container.json +1182 -0
- package/test/data/src/core/physics/trucks/rodotrem.json +148 -0
- package/test/data/src/core/physics/trucks/semi_reboque.json +91 -0
- package/test/data/src/core/physics/trucks/semi_reboque_rebaixado.json +1629 -0
- package/test/data/src/core/physics/trucks/simple_truck.json +85 -0
- package/test/data/src/core/physics/trucks/vanderleia_mechanical.json +105 -0
- package/test/data/src/core/physics/trucks/vanderleia_pneumatic.json +105 -0
- package/test/src/core/orchestration/request_schema.test.ts +20 -0
- package/test/src/core/orchestration/weight_by_axis_task.test.ts +87 -0
- package/test/src/core/physics/items/center_of_mass.test.ts +38 -0
- package/test/src/core/physics/items/multi_container_allocated_items.test.ts +22 -0
- package/test/src/core/physics/math_input_helpers.ts +64 -0
- package/test/src/core/physics/models/bitrem_model.test.ts +54 -0
- package/test/src/core/physics/models/deflection/deflection_model.test.ts +78 -0
- package/test/src/core/physics/models/rodotrem_model.test.ts +29 -0
- package/test/src/core/physics/models/semi_reboque_model.test.ts +72 -0
- package/test/src/core/physics/models/simple_truck_model.test.ts +23 -0
- package/test/src/core/physics/models/tare_model.test.ts +34 -0
- package/test/src/core/physics/models/vanderleia_model.test.ts +36 -0
- package/test/src/core/physics/services/axle_weight_service.test.ts +56 -0
- package/test/src/core/physics/services/cm_axle_weight_service.test.ts +23 -0
- package/test/src/core/physics/services/container_corner_forces.test.ts +23 -0
- package/test/src/core/physics/test_helpers.ts +13 -0
- package/test/src/core/physics/transports/chassi.test.ts +35 -0
- package/test/src/core/physics/transports/containerweight/container_weight_model.test.ts +57 -0
- package/test/src/core/physics/transports/tare/bitrem_axle_splitter.test.ts +30 -0
- package/test/src/index.test.ts +35 -0
- package/tsconfig.eslint.json +15 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { VEHICLE_VERSION } from '../../contracts/vehicle_version.js'
|
|
2
|
+
import type { Transport } from '../transports/transport.js'
|
|
3
|
+
import { scale_tare } from './old_tare_scale.js'
|
|
4
|
+
|
|
5
|
+
const TRUNCATED_LIMIT = 13000
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @param transport - Parsed transport.
|
|
9
|
+
* @returns Semireboque tare per axle.
|
|
10
|
+
*/
|
|
11
|
+
export function semireboque_tare(transport: Transport): number[]
|
|
12
|
+
{
|
|
13
|
+
const version = transport.vehicle_version
|
|
14
|
+
if (version === VEHICLE_VERSION.SEMIREBOQUE_QUAD
|
|
15
|
+
|| version === VEHICLE_VERSION.SEMIREBOQUE_QUAD_ALT)
|
|
16
|
+
{
|
|
17
|
+
return scale_tare(transport.tare, [0.27509640559, 0.29967158355, 0.11978366503, 0.30544834583])
|
|
18
|
+
}
|
|
19
|
+
if (version === VEHICLE_VERSION.SEMIREBOQUE_BITRUCK)
|
|
20
|
+
{
|
|
21
|
+
return scale_tare(transport.tare, [0.17852139406, 0.17852139406, 0.43218944824, 0.21076776365])
|
|
22
|
+
}
|
|
23
|
+
return semireboque_standard_tare(transport)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function semireboque_standard_tare(transport: Transport): number[]
|
|
27
|
+
{
|
|
28
|
+
const axle_1_max = transport.axle_manager.get_axle(1).max_supported_weight
|
|
29
|
+
if (axle_1_max > TRUNCATED_LIMIT)
|
|
30
|
+
{
|
|
31
|
+
return semireboque_heavy_axle_tare(transport.tare)
|
|
32
|
+
}
|
|
33
|
+
if (transport.tare < 18500)
|
|
34
|
+
{
|
|
35
|
+
return scale_tare(transport.tare, [0.312, 0.2, 0.488])
|
|
36
|
+
}
|
|
37
|
+
return scale_tare(transport.tare, [0.26, 0.35, 0.39])
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function semireboque_heavy_axle_tare(tare: number): number[]
|
|
41
|
+
{
|
|
42
|
+
if (tare > 19000)
|
|
43
|
+
{
|
|
44
|
+
return scale_tare(tare, [0.24, 0.35, 0.41])
|
|
45
|
+
}
|
|
46
|
+
if (tare > 17000)
|
|
47
|
+
{
|
|
48
|
+
return scale_tare(tare, [0.3, 0.315, 0.385])
|
|
49
|
+
}
|
|
50
|
+
return scale_tare(tare, [0.286, 0.379, 0.335])
|
|
51
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { VEHICLE_VERSION } from '../../contracts/vehicle_version.js'
|
|
2
|
+
import type { Transport } from '../transports/transport.js'
|
|
3
|
+
import { scale_tare } from './old_tare_scale.js'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @param transport - Truck or VUC transport.
|
|
7
|
+
* @returns Tare per axle.
|
|
8
|
+
*/
|
|
9
|
+
export function truck_tare(transport: Transport): number[]
|
|
10
|
+
{
|
|
11
|
+
const multipliers = transport.vehicle_version === VEHICLE_VERSION.CAMINHAO_BITRUCK
|
|
12
|
+
? [0.2834844826865682, 0.28348448268656806, 0.43303103462686376]
|
|
13
|
+
: [0.452, 0.548]
|
|
14
|
+
return scale_tare(transport.tare, multipliers)
|
|
15
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { Transport } from '../transports/transport.js'
|
|
2
|
+
import { scale_tare } from './old_tare_scale.js'
|
|
3
|
+
|
|
4
|
+
const TRUNCATED_LIMIT = 13000
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @param transport - Parsed transport.
|
|
8
|
+
* @returns Vanderleia tare per axle.
|
|
9
|
+
*/
|
|
10
|
+
export function vanderleia_tare(transport: Transport): number[]
|
|
11
|
+
{
|
|
12
|
+
const axle_1_max = transport.axle_manager.get_axle(1).max_supported_weight
|
|
13
|
+
if (axle_1_max > TRUNCATED_LIMIT)
|
|
14
|
+
{
|
|
15
|
+
return vanderleia_heavy_axle_tare(transport.tare)
|
|
16
|
+
}
|
|
17
|
+
return vanderleia_light_axle_tare(transport.tare)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function vanderleia_heavy_axle_tare(tare: number): number[]
|
|
21
|
+
{
|
|
22
|
+
if (tare > 23500)
|
|
23
|
+
{
|
|
24
|
+
return scale_tare(tare, [0.22, 0.33, 0.155, 0.155, 0.14])
|
|
25
|
+
}
|
|
26
|
+
if (tare > 21000)
|
|
27
|
+
{
|
|
28
|
+
return scale_tare(tare, [0.25, 0.32, 0.145, 0.145, 0.14])
|
|
29
|
+
}
|
|
30
|
+
return scale_tare(tare, [0.267, 0.314, 0.141, 0.141, 0.137])
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function vanderleia_light_axle_tare(tare: number): number[]
|
|
34
|
+
{
|
|
35
|
+
if (tare > 23500)
|
|
36
|
+
{
|
|
37
|
+
return scale_tare(tare, [0.22, 0.24, 0.185, 0.185, 0.17])
|
|
38
|
+
}
|
|
39
|
+
if (tare > 21000)
|
|
40
|
+
{
|
|
41
|
+
return scale_tare(tare, [0.25, 0.2, 0.185, 0.185, 0.18])
|
|
42
|
+
}
|
|
43
|
+
return scale_tare(tare, [0.267, 0.164, 0.191, 0.191, 0.187])
|
|
44
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { VEHICLE_TYPE } from '../../contracts/vehicle_type.js'
|
|
2
|
+
import type { Transport } from '../transports/transport.js'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Converts loaded cargo per axle into utilization percentages.
|
|
6
|
+
*/
|
|
7
|
+
export class PercentageOnAxlesCalculator
|
|
8
|
+
{
|
|
9
|
+
/**
|
|
10
|
+
* @param transport - Parsed transport.
|
|
11
|
+
*/
|
|
12
|
+
constructor(private readonly transport: Transport)
|
|
13
|
+
{}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @param loaded_weight_list - Cargo load per axle index.
|
|
17
|
+
* @returns Utilization ratio per axle (bitrem: 4 entries).
|
|
18
|
+
*/
|
|
19
|
+
weight_on_axles_to_percentages(loaded_weight_list: number[]): number[]
|
|
20
|
+
{
|
|
21
|
+
if (this.transport.vehicle_type === VEHICLE_TYPE.BITREM)
|
|
22
|
+
{
|
|
23
|
+
return [
|
|
24
|
+
this.calculate_percentage(0, loaded_weight_list[0]),
|
|
25
|
+
this.calculate_percentage(1, loaded_weight_list[1]),
|
|
26
|
+
this.calculate_bitrem_joined_percentage(
|
|
27
|
+
loaded_weight_list[2] + loaded_weight_list[3]),
|
|
28
|
+
this.calculate_percentage(4, loaded_weight_list[4])
|
|
29
|
+
]
|
|
30
|
+
}
|
|
31
|
+
return this.transport.axle_manager.list_axles_indexes().map((index) =>
|
|
32
|
+
this.calculate_percentage(index, loaded_weight_list[index]))
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
private calculate_percentage(axle_index: number, loaded_weight: number): number
|
|
36
|
+
{
|
|
37
|
+
const axle = this.transport.axle_manager.get_axle(axle_index)
|
|
38
|
+
return (loaded_weight + axle.tare) / axle.max_supported_weight
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
private calculate_bitrem_joined_percentage(loaded_weight: number): number
|
|
42
|
+
{
|
|
43
|
+
const axle_2 = this.transport.axle_manager.get_axle(2)
|
|
44
|
+
const axle_3 = this.transport.axle_manager.get_axle(3)
|
|
45
|
+
const total_tare = axle_2.tare + axle_3.tare
|
|
46
|
+
const total_max = axle_2.max_supported_weight + axle_3.max_supported_weight
|
|
47
|
+
return (loaded_weight + total_tare) / total_max
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { Transport } from '../transports/transport.js'
|
|
2
|
+
import { Chassi } from '../transports/chassi.js'
|
|
3
|
+
import { CHASSI_REFERENCE } from '../../contracts/chassi_reference.js'
|
|
4
|
+
import { CenterOfMass } from '../items/center_of_mass.js'
|
|
5
|
+
import { ChassiForces } from './chassi_forces.js'
|
|
6
|
+
import { SemiReboqueBase } from './semi_reboque_base.js'
|
|
7
|
+
import { solve_linear_system } from '../../math/gaussian_elimination.js'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Quad-axle semi-trailer (equivalent semi + 2×2 split on axles 3–4).
|
|
11
|
+
*/
|
|
12
|
+
export class QuadSemiTrailerModel
|
|
13
|
+
{
|
|
14
|
+
private readonly chassi: Chassi
|
|
15
|
+
readonly equivalent_semi_trailer: SemiReboqueBase
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @param transport - Parsed transport.
|
|
19
|
+
*/
|
|
20
|
+
constructor(transport: Transport)
|
|
21
|
+
{
|
|
22
|
+
this.chassi = new Chassi(transport)
|
|
23
|
+
this.equivalent_semi_trailer = new SemiReboqueBase(transport)
|
|
24
|
+
this.equivalent_semi_trailer.set_linear_system_matrix(
|
|
25
|
+
get_equivalent_chassi_positions(this.chassi, transport))
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @param center_of_mass_by_grouper - CM per grouper.
|
|
30
|
+
* @returns Four-axle chassis forces.
|
|
31
|
+
*/
|
|
32
|
+
calculate_chassi_forces_with_load_center_of_mass(
|
|
33
|
+
center_of_mass_by_grouper: Record<number, CenterOfMass>
|
|
34
|
+
): ChassiForces
|
|
35
|
+
{
|
|
36
|
+
const equivalent = this.equivalent_semi_trailer
|
|
37
|
+
.calculate_chassi_forces_with_load_center_of_mass(center_of_mass_by_grouper)
|
|
38
|
+
const equivalent_z = this.equivalent_semi_trailer.chassi_positions[4]
|
|
39
|
+
const independent = [
|
|
40
|
+
equivalent.get_force_on_axle(2),
|
|
41
|
+
equivalent.get_force_on_axle(2) * equivalent_z
|
|
42
|
+
]
|
|
43
|
+
const quad = solve_linear_system(generate_quad_matrix(this.chassi), independent)
|
|
44
|
+
const forces = new ChassiForces()
|
|
45
|
+
forces.add_axle_forces([
|
|
46
|
+
equivalent.get_force_on_axle(0),
|
|
47
|
+
equivalent.get_force_on_axle(1),
|
|
48
|
+
quad[0],
|
|
49
|
+
quad[1]
|
|
50
|
+
])
|
|
51
|
+
forces.add_pin_forces([equivalent.get_force_on_pin(0)])
|
|
52
|
+
return forces
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* @param chassi - Chassis geometry.
|
|
58
|
+
* @returns 2×2 quad axle matrix.
|
|
59
|
+
*/
|
|
60
|
+
function generate_quad_matrix(chassi: Chassi): number[][]
|
|
61
|
+
{
|
|
62
|
+
const semi_axle_3 = chassi.get_axle_position(2, CHASSI_REFERENCE.GROUPER_1)
|
|
63
|
+
const semi_axle_4 = chassi.get_axle_position(3, CHASSI_REFERENCE.GROUPER_1)
|
|
64
|
+
return [[1, 1], [semi_axle_3, semi_axle_4]]
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* @param chassi - Chassis geometry.
|
|
69
|
+
* @param transport - Parsed transport.
|
|
70
|
+
* @returns Equivalent 5-position layout for semi base.
|
|
71
|
+
*/
|
|
72
|
+
function get_equivalent_chassi_positions(chassi: Chassi, transport: Transport): number[]
|
|
73
|
+
{
|
|
74
|
+
const tractor_pin = chassi.get_pin_position(0, CHASSI_REFERENCE.TRACTOR)
|
|
75
|
+
const tractor_axle_1 = chassi.get_axle_position(0, CHASSI_REFERENCE.TRACTOR)
|
|
76
|
+
const tractor_axle_2 = chassi.get_axle_position(1, CHASSI_REFERENCE.TRACTOR)
|
|
77
|
+
const semi_pin = chassi.get_pin_position(0, CHASSI_REFERENCE.GROUPER_1)
|
|
78
|
+
const semi_axle_3 = chassi.get_axle_position(2, CHASSI_REFERENCE.GROUPER_1)
|
|
79
|
+
const semi_axle_4 = chassi.get_axle_position(3, CHASSI_REFERENCE.GROUPER_1)
|
|
80
|
+
const axle_3 = transport.axle_manager.get_axle(2)
|
|
81
|
+
const axle_4 = transport.axle_manager.get_axle(3)
|
|
82
|
+
const semi_equivalent = (
|
|
83
|
+
semi_axle_3 * axle_3.max_supported_weight
|
|
84
|
+
+ semi_axle_4 * axle_4.max_supported_weight
|
|
85
|
+
) / (axle_3.max_supported_weight + axle_4.max_supported_weight)
|
|
86
|
+
return [tractor_pin, tractor_axle_1, tractor_axle_2, semi_pin, semi_equivalent]
|
|
87
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import type { Transport } from '../transports/transport.js'
|
|
2
|
+
import type { MultiContainerAllocatedItems } from '../items/multi_container_allocated_items.js'
|
|
3
|
+
import { calculate_chassi_forces_from_multi } from '../items/compute_grouper_center_of_mass.js'
|
|
4
|
+
import { Chassi } from '../transports/chassi.js'
|
|
5
|
+
import { CHASSI_REFERENCE } from '../../contracts/chassi_reference.js'
|
|
6
|
+
import { CenterOfMass } from '../items/center_of_mass.js'
|
|
7
|
+
import { ChassiForces } from './chassi_forces.js'
|
|
8
|
+
import { solve_linear_system } from '../../math/gaussian_elimination.js'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Rodotrem: semi+tractor 4×4 plus simple trailer 2-axle lever.
|
|
12
|
+
*/
|
|
13
|
+
export class RodotremModel
|
|
14
|
+
{
|
|
15
|
+
readonly chassi: Chassi
|
|
16
|
+
private readonly matrix: number[][]
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @param transport - Parsed transport.
|
|
20
|
+
*/
|
|
21
|
+
constructor(private readonly transport: Transport)
|
|
22
|
+
{
|
|
23
|
+
this.chassi = new Chassi(transport)
|
|
24
|
+
this.matrix = generate_rodotrem_semi_matrix(this.chassi)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @param multi_items - Allocated items.
|
|
29
|
+
* @returns Loaded weights per axle.
|
|
30
|
+
*/
|
|
31
|
+
calculate_weight_on_axles(multi_items: MultiContainerAllocatedItems): number[]
|
|
32
|
+
{
|
|
33
|
+
const forces = this.calculate_chassi_forces(multi_items)
|
|
34
|
+
return forces.list_axles_indexes().map((index) => forces.get_force_on_axle(index))
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @param multi_items - Allocated items.
|
|
39
|
+
* @returns Chassis forces.
|
|
40
|
+
*/
|
|
41
|
+
calculate_chassi_forces(multi_items: MultiContainerAllocatedItems): ChassiForces
|
|
42
|
+
{
|
|
43
|
+
return calculate_chassi_forces_from_multi(
|
|
44
|
+
this.transport,
|
|
45
|
+
multi_items,
|
|
46
|
+
(center_of_mass_by_grouper) =>
|
|
47
|
+
this.calculate_chassi_forces_with_load_center_of_mass(center_of_mass_by_grouper))
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* @param center_of_mass_by_grouper - CM for groupers 1 and 2.
|
|
52
|
+
* @returns Five-axle chassis forces.
|
|
53
|
+
*/
|
|
54
|
+
calculate_chassi_forces_with_load_center_of_mass(
|
|
55
|
+
center_of_mass_by_grouper: Record<number, CenterOfMass>
|
|
56
|
+
): ChassiForces
|
|
57
|
+
{
|
|
58
|
+
const semi_solution = solve_semi_tractor_system(
|
|
59
|
+
this.matrix,
|
|
60
|
+
center_of_mass_by_grouper[1])
|
|
61
|
+
const simple_solution = solve_simple_trailer_system(
|
|
62
|
+
this.chassi,
|
|
63
|
+
center_of_mass_by_grouper[2])
|
|
64
|
+
const forces = new ChassiForces()
|
|
65
|
+
forces.add_pin_forces([semi_solution[1]])
|
|
66
|
+
forces.add_axle_forces([
|
|
67
|
+
semi_solution[3],
|
|
68
|
+
semi_solution[2],
|
|
69
|
+
semi_solution[0],
|
|
70
|
+
simple_solution[1],
|
|
71
|
+
simple_solution[0]
|
|
72
|
+
])
|
|
73
|
+
return forces
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* @param chassi - Chassis geometry.
|
|
79
|
+
* @returns Semi+tractor 4×4 matrix.
|
|
80
|
+
*/
|
|
81
|
+
function generate_rodotrem_semi_matrix(chassi: Chassi): number[][]
|
|
82
|
+
{
|
|
83
|
+
const tractor_pin = chassi.get_pin_position(0, CHASSI_REFERENCE.TRACTOR)
|
|
84
|
+
const tractor_axle_1 = chassi.get_axle_position(0, CHASSI_REFERENCE.TRACTOR)
|
|
85
|
+
const tractor_axle_2 = chassi.get_axle_position(1, CHASSI_REFERENCE.TRACTOR)
|
|
86
|
+
const semi_pin = chassi.get_pin_position(0, CHASSI_REFERENCE.GROUPER_1)
|
|
87
|
+
const semi_axle_3 = chassi.get_axle_position(2, CHASSI_REFERENCE.GROUPER_1)
|
|
88
|
+
return [
|
|
89
|
+
[1, 1, 0, 0],
|
|
90
|
+
[semi_axle_3, semi_pin, 0, 0],
|
|
91
|
+
[0, -1, 1, 1],
|
|
92
|
+
[0, -tractor_pin, tractor_axle_2, tractor_axle_1]
|
|
93
|
+
]
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* @param matrix - Semi system matrix.
|
|
98
|
+
* @param center_of_mass - Semi trailer CM.
|
|
99
|
+
* @returns 4-vector solution.
|
|
100
|
+
*/
|
|
101
|
+
function solve_semi_tractor_system(matrix: number[][], center_of_mass: CenterOfMass): number[]
|
|
102
|
+
{
|
|
103
|
+
const independent = [
|
|
104
|
+
center_of_mass.mass,
|
|
105
|
+
center_of_mass.mass * center_of_mass.z,
|
|
106
|
+
0,
|
|
107
|
+
0
|
|
108
|
+
]
|
|
109
|
+
return solve_linear_system(matrix, independent)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* @param chassi - Chassis geometry.
|
|
114
|
+
* @param center_of_mass - Simple trailer CM.
|
|
115
|
+
* @returns Two-axle lever solution [axle4, axle5].
|
|
116
|
+
*/
|
|
117
|
+
function solve_simple_trailer_system(
|
|
118
|
+
chassi: Chassi,
|
|
119
|
+
center_of_mass: CenterOfMass
|
|
120
|
+
): [number, number]
|
|
121
|
+
{
|
|
122
|
+
const axle_4 = chassi.get_axle_position(3, CHASSI_REFERENCE.GROUPER_2)
|
|
123
|
+
const axle_5 = chassi.get_axle_position(4, CHASSI_REFERENCE.GROUPER_2)
|
|
124
|
+
const axle_4_force = center_of_mass.mass
|
|
125
|
+
* (axle_4 - center_of_mass.z)
|
|
126
|
+
/ (axle_4 - axle_5)
|
|
127
|
+
const axle_5_force = center_of_mass.mass
|
|
128
|
+
* (center_of_mass.z - axle_5)
|
|
129
|
+
/ (axle_4 - axle_5)
|
|
130
|
+
return [axle_4_force, axle_5_force]
|
|
131
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { Transport } from '../transports/transport.js'
|
|
2
|
+
import { Chassi } from '../transports/chassi.js'
|
|
3
|
+
import { CHASSI_REFERENCE } from '../../contracts/chassi_reference.js'
|
|
4
|
+
import { CenterOfMass } from '../items/center_of_mass.js'
|
|
5
|
+
import { ChassiForces } from './chassi_forces.js'
|
|
6
|
+
import { solve_linear_system } from '../../math/gaussian_elimination.js'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Semi-trailer 4×4 static system base.
|
|
10
|
+
*/
|
|
11
|
+
export class SemiReboqueBase
|
|
12
|
+
{
|
|
13
|
+
chassi_positions: number[] = []
|
|
14
|
+
private matrix: number[][] = []
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @param transport - Parsed transport.
|
|
18
|
+
*/
|
|
19
|
+
constructor(private readonly transport: Transport)
|
|
20
|
+
{
|
|
21
|
+
this.set_linear_system_matrix()
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @param center_of_mass_by_grouper - CM per grouper.
|
|
26
|
+
* @returns Chassis forces.
|
|
27
|
+
*/
|
|
28
|
+
calculate_chassi_forces_with_load_center_of_mass(
|
|
29
|
+
center_of_mass_by_grouper: Record<number, CenterOfMass>
|
|
30
|
+
): ChassiForces
|
|
31
|
+
{
|
|
32
|
+
const solution = this.solve_weight_on_axles_system(center_of_mass_by_grouper[1])
|
|
33
|
+
const forces = new ChassiForces()
|
|
34
|
+
forces.add_pin_forces([solution[1]])
|
|
35
|
+
forces.add_axle_forces([solution[3], solution[2], solution[0]])
|
|
36
|
+
return forces
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* @param chassi_positions - Optional preset positions.
|
|
41
|
+
*/
|
|
42
|
+
set_linear_system_matrix(chassi_positions?: number[]): void
|
|
43
|
+
{
|
|
44
|
+
if (chassi_positions)
|
|
45
|
+
{
|
|
46
|
+
this.chassi_positions = chassi_positions
|
|
47
|
+
}
|
|
48
|
+
else
|
|
49
|
+
{
|
|
50
|
+
this.chassi_positions = this.get_chassi_positions()
|
|
51
|
+
}
|
|
52
|
+
this.matrix = build_semi_matrix(this.chassi_positions)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* @param center_of_mass - Load CM.
|
|
57
|
+
* @returns 4-vector solution.
|
|
58
|
+
*/
|
|
59
|
+
private solve_weight_on_axles_system(center_of_mass: CenterOfMass): number[]
|
|
60
|
+
{
|
|
61
|
+
const independent = [
|
|
62
|
+
center_of_mass.mass,
|
|
63
|
+
center_of_mass.mass * center_of_mass.z,
|
|
64
|
+
0,
|
|
65
|
+
0
|
|
66
|
+
]
|
|
67
|
+
return solve_linear_system(this.matrix, independent)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* @returns Default chassis positions for semi system.
|
|
72
|
+
*/
|
|
73
|
+
private get_chassi_positions(): number[]
|
|
74
|
+
{
|
|
75
|
+
const chassi = new Chassi(this.transport)
|
|
76
|
+
return [
|
|
77
|
+
chassi.get_pin_position(0, CHASSI_REFERENCE.TRACTOR),
|
|
78
|
+
chassi.get_axle_position(0, CHASSI_REFERENCE.TRACTOR),
|
|
79
|
+
chassi.get_axle_position(1, CHASSI_REFERENCE.TRACTOR),
|
|
80
|
+
chassi.get_pin_position(0, CHASSI_REFERENCE.GROUPER_1),
|
|
81
|
+
chassi.get_axle_position(2, CHASSI_REFERENCE.GROUPER_1)
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* @param positions - Pin and axle positions.
|
|
88
|
+
* @returns 4×4 coefficient matrix.
|
|
89
|
+
*/
|
|
90
|
+
function build_semi_matrix(positions: number[]): number[][]
|
|
91
|
+
{
|
|
92
|
+
const tractor_pin = positions[0]
|
|
93
|
+
const tractor_axle_1 = positions[1]
|
|
94
|
+
const tractor_axle_2 = positions[2]
|
|
95
|
+
const semi_pin = positions[3]
|
|
96
|
+
const semi_axle_3 = positions[4]
|
|
97
|
+
return [
|
|
98
|
+
[1, 1, 0, 0],
|
|
99
|
+
[semi_axle_3, semi_pin, 0, 0],
|
|
100
|
+
[0, -1, 1, 1],
|
|
101
|
+
[0, -tractor_pin, tractor_axle_2, tractor_axle_1]
|
|
102
|
+
]
|
|
103
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import type { Transport } from '../transports/transport.js'
|
|
2
|
+
import { MergedContainers } from '../transports/merged_containers.js'
|
|
3
|
+
import type { MultiContainerAllocatedItems } from '../items/multi_container_allocated_items.js'
|
|
4
|
+
import {
|
|
5
|
+
calculate_chassi_forces_from_multi,
|
|
6
|
+
compute_center_of_mass_by_grouper
|
|
7
|
+
} from '../items/compute_grouper_center_of_mass.js'
|
|
8
|
+
import { VEHICLE_VERSION } from '../../contracts/vehicle_version.js'
|
|
9
|
+
import { CenterOfMass } from '../items/center_of_mass.js'
|
|
10
|
+
import { ChassiForces } from './chassi_forces.js'
|
|
11
|
+
import { SemiReboqueBase } from './semi_reboque_base.js'
|
|
12
|
+
import { QuadSemiTrailerModel } from './quad_semi_trailer_model.js'
|
|
13
|
+
import { BiTruckTractorSemiTrailerModel } from './bi_truck_tractor_semi_trailer_model.js'
|
|
14
|
+
|
|
15
|
+
type SemiDelegate = {
|
|
16
|
+
calculate_chassi_forces_with_load_center_of_mass: (
|
|
17
|
+
center_of_mass_by_grouper: Record<number, CenterOfMass>
|
|
18
|
+
) => ChassiForces
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Semi-reboque axle weight with quad/bitruck variants.
|
|
23
|
+
*/
|
|
24
|
+
export class SemiReboqueModel
|
|
25
|
+
{
|
|
26
|
+
private readonly delegate: SemiDelegate & {
|
|
27
|
+
chassi_positions?: number[]
|
|
28
|
+
equivalent_semi_trailer?: SemiReboqueBase
|
|
29
|
+
}
|
|
30
|
+
private readonly transport: Transport
|
|
31
|
+
private readonly merged_containers: MergedContainers
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @param transport - Parsed transport.
|
|
35
|
+
*/
|
|
36
|
+
constructor(transport: Transport)
|
|
37
|
+
{
|
|
38
|
+
this.transport = transport
|
|
39
|
+
this.merged_containers = new MergedContainers(transport)
|
|
40
|
+
if (transport.vehicle_version === VEHICLE_VERSION.SEMIREBOQUE_QUAD
|
|
41
|
+
|| transport.vehicle_version === VEHICLE_VERSION.SEMIREBOQUE_QUAD_ALT)
|
|
42
|
+
{
|
|
43
|
+
this.delegate = new QuadSemiTrailerModel(transport)
|
|
44
|
+
}
|
|
45
|
+
else if (transport.vehicle_version === VEHICLE_VERSION.SEMIREBOQUE_BITRUCK)
|
|
46
|
+
{
|
|
47
|
+
this.delegate = new BiTruckTractorSemiTrailerModel(transport)
|
|
48
|
+
}
|
|
49
|
+
else
|
|
50
|
+
{
|
|
51
|
+
const base = new SemiReboqueBase(transport)
|
|
52
|
+
base.set_linear_system_matrix()
|
|
53
|
+
this.delegate = base
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* @param multi_items - Allocated items.
|
|
59
|
+
* @returns Loaded weights per axle.
|
|
60
|
+
*/
|
|
61
|
+
calculate_weight_on_axles(multi_items: MultiContainerAllocatedItems): number[]
|
|
62
|
+
{
|
|
63
|
+
const forces = this.calculate_chassi_forces(multi_items)
|
|
64
|
+
return forces.list_axles_indexes().map((index) => forces.get_force_on_axle(index))
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* @param multi_items - Allocated items.
|
|
69
|
+
* @returns Chassis forces.
|
|
70
|
+
*/
|
|
71
|
+
calculate_chassi_forces(multi_items: MultiContainerAllocatedItems): ChassiForces
|
|
72
|
+
{
|
|
73
|
+
return calculate_chassi_forces_from_multi(
|
|
74
|
+
this.transport,
|
|
75
|
+
multi_items,
|
|
76
|
+
(center_of_mass_by_grouper) =>
|
|
77
|
+
this.calculate_chassi_forces_with_load_center_of_mass(center_of_mass_by_grouper))
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* @param multi_items - Allocated items.
|
|
82
|
+
* @returns Deflection support pairs.
|
|
83
|
+
*/
|
|
84
|
+
calculate_support_data(multi_items: MultiContainerAllocatedItems): [number, number][]
|
|
85
|
+
{
|
|
86
|
+
const quad_or_bitruck = this.transport.vehicle_version === VEHICLE_VERSION.SEMIREBOQUE_QUAD
|
|
87
|
+
|| this.transport.vehicle_version === VEHICLE_VERSION.SEMIREBOQUE_QUAD_ALT
|
|
88
|
+
|| this.transport.vehicle_version === VEHICLE_VERSION.SEMIREBOQUE_BITRUCK
|
|
89
|
+
if (quad_or_bitruck)
|
|
90
|
+
{
|
|
91
|
+
const center_of_mass_by_grouper = compute_center_of_mass_by_grouper(
|
|
92
|
+
multi_items,
|
|
93
|
+
this.merged_containers)
|
|
94
|
+
const quad = this.delegate as QuadSemiTrailerModel
|
|
95
|
+
const forces = quad.equivalent_semi_trailer
|
|
96
|
+
.calculate_chassi_forces_with_load_center_of_mass(center_of_mass_by_grouper)
|
|
97
|
+
const positions = quad.equivalent_semi_trailer.chassi_positions
|
|
98
|
+
return [[positions[3], forces.get_force_on_pin(0)], [positions[4], forces.get_force_on_axle(2)]]
|
|
99
|
+
}
|
|
100
|
+
const forces = this.calculate_chassi_forces(multi_items)
|
|
101
|
+
const base = this.delegate as SemiReboqueBase
|
|
102
|
+
return [
|
|
103
|
+
[base.chassi_positions[3], forces.get_force_on_pin(0)],
|
|
104
|
+
[base.chassi_positions[4], forces.get_force_on_axle(2)]
|
|
105
|
+
]
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* @returns Merged grouper 1 length.
|
|
110
|
+
*/
|
|
111
|
+
calculate_container_length(): number
|
|
112
|
+
{
|
|
113
|
+
return this.merged_containers.get_container_by_grouper_index(1).length
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* @param center_of_mass_by_grouper - CM per grouper.
|
|
118
|
+
* @returns Chassis forces.
|
|
119
|
+
*/
|
|
120
|
+
calculate_chassi_forces_with_load_center_of_mass(
|
|
121
|
+
center_of_mass_by_grouper: Record<number, CenterOfMass>
|
|
122
|
+
): ChassiForces
|
|
123
|
+
{
|
|
124
|
+
return this.delegate.calculate_chassi_forces_with_load_center_of_mass(
|
|
125
|
+
center_of_mass_by_grouper)
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { Transport } from '../transports/transport.js'
|
|
2
|
+
import { Chassi } from '../transports/chassi.js'
|
|
3
|
+
import { CHASSI_REFERENCE } from '../../contracts/chassi_reference.js'
|
|
4
|
+
import { CenterOfMass } from '../items/center_of_mass.js'
|
|
5
|
+
import { ChassiForces } from './chassi_forces.js'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Two-axle truck lever equilibrium.
|
|
9
|
+
*/
|
|
10
|
+
export class SimpleTruckBase
|
|
11
|
+
{
|
|
12
|
+
axles_positions: number[] = []
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @param transport - Parsed transport.
|
|
16
|
+
*/
|
|
17
|
+
constructor(private readonly transport: Transport)
|
|
18
|
+
{
|
|
19
|
+
this.set_axles_positions()
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @param center_of_mass_by_grouper - CM per grouper id.
|
|
24
|
+
* @returns Chassis forces.
|
|
25
|
+
*/
|
|
26
|
+
calculate_chassi_forces_with_load_center_of_mass(
|
|
27
|
+
center_of_mass_by_grouper: Record<number, CenterOfMass>
|
|
28
|
+
): ChassiForces
|
|
29
|
+
{
|
|
30
|
+
const center_of_mass = center_of_mass_by_grouper[1]
|
|
31
|
+
const [axle_1, axle_2] = this.solve_linear_system(center_of_mass)
|
|
32
|
+
const forces = new ChassiForces()
|
|
33
|
+
forces.add_axle_forces([axle_1, axle_2])
|
|
34
|
+
return forces
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @param axles_positions - Optional preset positions.
|
|
39
|
+
*/
|
|
40
|
+
set_axles_positions(axles_positions?: number[]): void
|
|
41
|
+
{
|
|
42
|
+
if (axles_positions)
|
|
43
|
+
{
|
|
44
|
+
this.axles_positions = axles_positions
|
|
45
|
+
return
|
|
46
|
+
}
|
|
47
|
+
const chassi = new Chassi(this.transport)
|
|
48
|
+
this.axles_positions = [
|
|
49
|
+
chassi.get_axle_position(0, CHASSI_REFERENCE.GROUPER_1),
|
|
50
|
+
chassi.get_axle_position(1, CHASSI_REFERENCE.GROUPER_1)
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* @param center_of_mass - Load center of mass.
|
|
56
|
+
* @returns Axle 1 and 2 cargo reactions.
|
|
57
|
+
*/
|
|
58
|
+
private solve_linear_system(center_of_mass: CenterOfMass): [number, number]
|
|
59
|
+
{
|
|
60
|
+
const axle_1_position = this.axles_positions[0]
|
|
61
|
+
const axle_2_position = this.axles_positions[1]
|
|
62
|
+
const axle_1 = center_of_mass.mass
|
|
63
|
+
* (center_of_mass.z - axle_2_position)
|
|
64
|
+
/ (axle_1_position - axle_2_position)
|
|
65
|
+
const axle_2 = center_of_mass.mass
|
|
66
|
+
* (axle_1_position - center_of_mass.z)
|
|
67
|
+
/ (axle_1_position - axle_2_position)
|
|
68
|
+
return [axle_1, axle_2]
|
|
69
|
+
}
|
|
70
|
+
}
|