Skip to content

ifc-schedule ​

IFC scheduling: IfcTask/IfcWorkSchedule, sequencing, 4D linkage.

StatusPartial
Latest release0.3.0 (2026-09-29)
Registriescrates.io ifc-schedule
Via the facadeopenbim-ifc feature schedule
API documentationrustdoc · docs.rs
Sourcecrates/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-bound create_lag_time. IFC2X3 declares no IfcLagTime and is refused with EntityNotInSchema, nothing staged; IFC4 and IFC4X3 stage exactly what create_lag_time stages. create_lag_time documents that it is for IFC4 and IFC4X3 only (#211).
  • IFC2X3 work plans and work schedules can be authored (#214): DateTimeValue carries a date either as IFC4/IFC4X3 IfcDateTime text (DateTimeValue::Text, From<&str>) or as one of the IFC2X3 IfcDateTimeSelect records (Date(CalendarDate), Time(LocalTime), DateAndTime(CalendarDate, LocalTime)). In IFC2X3 create_work_control_with_owner_history stages the IfcCalendarDate, IfcLocalTime and IfcDateAndTime records and references them, only once the work control itself is accepted. Record forms are checked against the schema's rules before anything is staged (IfcValidCalendarDate with IfcLeapYear, IfcValidTime, and the ranges of IfcMonthInYearNumber, IfcHourInDay, IfcMinuteInHour and IfcSecondInMinute), refused with InvalidValue. CalendarDate and LocalTime are #[non_exhaustive]; LocalTime does not yet carry Zone or DaylightSavingOffset, which are written $.
  • IFC2X3 sequences can be authored (#214): TimeLag::Seconds is the IFC2X3 IfcRelSequence.TimeLag : IfcTimeMeasure, TimeLag::LagTime the IFC4/IFC4X3 IfcLagTime reference. A non-finite lag is refused with InvalidValue.
  • ProcedureDraft::user_defined_procedure_type, written as the IFC2X3 IfcProcedure.UserDefinedProcedureType (#214), so a USERDEFINED IFC2X3 procedure can be authored.
  • Every draft has a new constructor 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, as ifc-resource's drafts are built.

Fixed ​

  • create_work_control_with_owner_history, create_sequence_with_owner_history and create_procedure_with_owner_history no longer refuse the IFC2X3 records the drafts could not carry (#214). IfcProcedure.WR4 is enforced instead: an IFC2X3 USERDEFINED procedure without a non-blank user_defined_procedure_type is refused with InvalidValue.
  • The release-bound writers refuse a SchemaVersion this build carries no table for with UnsupportedSchema instead 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 Status as the long description, WorkMethod as the status and Priority as the milestone flag, and an IFC2X3 work plan or schedule its WorkControlType as the predefined type. The header binds IFC2X3, IFC4 or IFC4X3 (none reads as IFC4); IFC4X1, IFC4X2, unknown and multiple schemas are refused with the new ScheduleReadError. IFC4 and IFC4X3 answers are unchanged.
  • tasks, work_plans, work_schedules, sequences, predecessors_of, successors_of, start_tasks, end_tasks, tasks_of_schedule and subtasks_of return Result<_, ScheduleReadError>; find_cycle returns Result<Option<SequenceCycle>, ScheduleReadError>; downstream_of and execution_order return ScheduleReadError::Cycle(SequenceCycle) for a loop instead of a bare SequenceCycle.
  • Task::new(id, entity, release) and WorkControl::new(id, entity, release) take the SchemaVersion to read against and return Result, refusing IFC4X1 and IFC4X2; WorkControl::new is Ok(None) for another entity. Task::release and WorkControl::release report the binding.
  • An attribute IFC2X3 does not declare reads as None: Task:: long_description, predefined_type and task_time_ref, and WorkControl::predefined_type. Task::identification reads IFC2X3's TaskId and WorkControl::identification its Identifier, which IFC4 promoted to Identification. WorkControl::work_control_type reads IFC2X3's WorkControlType, which is not aliased to PredefinedType.
  • WorkControl::creation_date, start_time and finish_time return Option<AuthoredDateTime> (IFC4/IFC4X3 text, or the IFC2X3 IfcDateTimeSelect record), and duration and total_float return Option<AuthoredDuration> (IFC4/IFC4X3 text, or the IFC2X3 IfcTimeMeasure), instead of None for a stated IFC2X3 value.
  • Sequence gains time_lag_measure, IFC2X3's IfcRelSequence.TimeLag (an IfcTimeMeasure on the relationship); lag stays the IFC4/IFC4X3 IfcLagTime.
  • TaskDraft, WorkControlDraft, EventDraft, EventTimeDraft, RecurrenceDraft, ProcedureDraft and TaskTimeDraft are #[non_exhaustive]: build them with new and the setters instead of a struct literal. Their fields stay public to read and assign.
  • WorkControlDraft::creation_date and start_time are DateTimeValue<'a> (were &'a str) and finish_time is Option<DateTimeValue<'a>> (was Option<&'a str>). The plain create_work_control refuses a record form with InvalidValue; with text its output is unchanged.
  • create_sequence_with_owner_history takes time_lag: Option<TimeLag> (was Option<EntityId>); wrap an IfcLagTime id in TimeLag::LagTime. The plain create_sequence is unchanged.
  • ProcedureDraft has the new user_defined_procedure_type field; the plain create_procedure, which writes IFC4/IFC4X3, refuses a value for it with InvalidValue, and the release-bound writer refuses it in IFC4 and IFC4X3 with AuthoringNotInSchema.
  • #[non_exhaustive] on the public enums and result structs a later release could extend: SequenceType, DurationType, TaskTimeAnomaly, WorkControlKind, WorkTimeRole, RecurrenceType, Lag, Sequence, SequenceCycle, EventTime, Recurrence and WorkTime. A match outside the crate needs a wildcard arm, and the structs can no longer be built outside it.

Changed ​

  • Depends on ifc-schema with 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 IFC4X1 or IFC4X2 is refused with the existing unsupported-schema error. ifc-schema now 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

Released under the AGPL-3.0-or-later licence. ISO and CEN standards material is not redistributed.