ifc-schedule
IFC scheduling: IfcTask/IfcWorkSchedule, sequencing, 4D linkage.
| Status | Partial |
| Latest release | 0.3.0 (2026-09-29) |
| Registries | crates.io ifc-schedule |
| Via the facade | openbim-ifc feature schedule |
| API documentation | rustdoc · docs.rs |
| Source | crates/ifc-schedule/ |
Overview
ifc-schedule — construction scheduling as a view over the model.
Depends on
Changes
Latest release, 0.3.0 (2026-09-29):
Added
create_lag_time_in(tx, model, name, lag_value, duration_type): the model-boundcreate_lag_time. IFC2X3 declares noIfcLagTimeand is refused withEntityNotInSchema, nothing staged; IFC4 and IFC4X3 stage exactly whatcreate_lag_timestages.create_lag_timedocuments that it is for IFC4 and IFC4X3 only (#211).- IFC2X3 work plans and work schedules can be authored (#214):
DateTimeValuecarries a date either as IFC4/IFC4X3IfcDateTimetext (DateTimeValue::Text,From<&str>) or as one of the IFC2X3IfcDateTimeSelectrecords (Date(CalendarDate),Time(LocalTime),DateAndTime(CalendarDate, LocalTime)). In IFC2X3create_work_control_with_owner_historystages theIfcCalendarDate,IfcLocalTimeandIfcDateAndTimerecords and references them, only once the work control itself is accepted. Record forms are checked against the schema's rules before anything is staged (IfcValidCalendarDatewithIfcLeapYear,IfcValidTime, and the ranges ofIfcMonthInYearNumber,IfcHourInDay,IfcMinuteInHourandIfcSecondInMinute), refused withInvalidValue.CalendarDateandLocalTimeare#[non_exhaustive];LocalTimedoes not yet carryZoneorDaylightSavingOffset, which are written$. - IFC2X3 sequences can be authored (#214):
TimeLag::Secondsis the IFC2X3IfcRelSequence.TimeLag : IfcTimeMeasure,TimeLag::LagTimethe IFC4/IFC4X3IfcLagTimereference. A non-finite lag is refused withInvalidValue. ProcedureDraft::user_defined_procedure_type, written as the IFC2X3IfcProcedure.UserDefinedProcedureType(#214), so aUSERDEFINEDIFC2X3 procedure can be authored.- Every draft has a
newconstructor taking its required fields (TaskDraft::new(global_id),WorkControlDraft::new(global_id, creation_date, start_time),EventDraft::new(global_id),ProcedureDraft::new(global_id),RecurrenceDraft::new(recurrence_type),EventTimeDraft::new(),TaskTimeDraft::new()) and a setter per other field, named after it, asifc-resource's drafts are built.
Fixed
create_work_control_with_owner_history,create_sequence_with_owner_historyandcreate_procedure_with_owner_historyno longer refuse the IFC2X3 records the drafts could not carry (#214).IfcProcedure.WR4is enforced instead: an IFC2X3USERDEFINEDprocedure without a non-blankuser_defined_procedure_typeis refused withInvalidValue.- The release-bound writers refuse a
SchemaVersionthis build carries no table for withUnsupportedSchemainstead of panicking.
Changed (breaking)
- The task, work-control and sequence readers bind the model's declared release and read every attribute by name from its table (#212). They read IFC4 slot constants from every file, so an IFC2X3 task answered its
Statusas the long description,WorkMethodas the status andPriorityas the milestone flag, and an IFC2X3 work plan or schedule itsWorkControlTypeas the predefined type. The header binds IFC2X3, IFC4 or IFC4X3 (none reads as IFC4); IFC4X1, IFC4X2, unknown and multiple schemas are refused with the newScheduleReadError. IFC4 and IFC4X3 answers are unchanged. tasks,work_plans,work_schedules,sequences,predecessors_of,successors_of,start_tasks,end_tasks,tasks_of_scheduleandsubtasks_ofreturnResult<_, ScheduleReadError>;find_cyclereturnsResult<Option<SequenceCycle>, ScheduleReadError>;downstream_ofandexecution_orderreturnScheduleReadError::Cycle(SequenceCycle)for a loop instead of a bareSequenceCycle.Task::new(id, entity, release)andWorkControl::new(id, entity, release)take theSchemaVersionto read against and returnResult, refusing IFC4X1 and IFC4X2;WorkControl::newisOk(None)for another entity.Task::releaseandWorkControl::releasereport the binding.- An attribute IFC2X3 does not declare reads as
None:Task:: long_description,predefined_typeandtask_time_ref, andWorkControl::predefined_type.Task::identificationreads IFC2X3'sTaskIdandWorkControl::identificationitsIdentifier, which IFC4 promoted toIdentification.WorkControl::work_control_typereads IFC2X3'sWorkControlType, which is not aliased toPredefinedType. WorkControl::creation_date,start_timeandfinish_timereturnOption<AuthoredDateTime>(IFC4/IFC4X3 text, or the IFC2X3IfcDateTimeSelectrecord), anddurationandtotal_floatreturnOption<AuthoredDuration>(IFC4/IFC4X3 text, or the IFC2X3IfcTimeMeasure), instead ofNonefor a stated IFC2X3 value.Sequencegainstime_lag_measure, IFC2X3'sIfcRelSequence.TimeLag(anIfcTimeMeasureon the relationship);lagstays the IFC4/IFC4X3IfcLagTime.TaskDraft,WorkControlDraft,EventDraft,EventTimeDraft,RecurrenceDraft,ProcedureDraftandTaskTimeDraftare#[non_exhaustive]: build them withnewand the setters instead of a struct literal. Their fields stay public to read and assign.WorkControlDraft::creation_dateandstart_timeareDateTimeValue<'a>(were&'a str) andfinish_timeisOption<DateTimeValue<'a>>(wasOption<&'a str>). The plaincreate_work_controlrefuses a record form withInvalidValue; with text its output is unchanged.create_sequence_with_owner_historytakestime_lag: Option<TimeLag>(wasOption<EntityId>); wrap anIfcLagTimeid inTimeLag::LagTime. The plaincreate_sequenceis unchanged.ProcedureDrafthas the newuser_defined_procedure_typefield; the plaincreate_procedure, which writes IFC4/IFC4X3, refuses a value for it withInvalidValue, and the release-bound writer refuses it in IFC4 and IFC4X3 withAuthoringNotInSchema.#[non_exhaustive]on the public enums and result structs a later release could extend:SequenceType,DurationType,TaskTimeAnomaly,WorkControlKind,WorkTimeRole,RecurrenceType,Lag,Sequence,SequenceCycle,EventTime,RecurrenceandWorkTime. Amatchoutside the crate needs a wildcard arm, and the structs can no longer be built outside it.
Changed
- Depends on
ifc-schemawith its default features named explicitly (every bundled release), now that the workspace dependency turns them off for the facade's per-release features (#112). - A model whose header declares
IFC4X1orIFC4X2is refused with the existing unsupported-schema error.ifc-schemanow bundles both releases, but no layout here is verified against them, so they are never read as IFC4 or IFC4X3.
Full history: crates/ifc-schedule/CHANGELOG.md